열어본 파일을 닫지 않은 경우 더 이상 참조되지 않은 후 파이썬에 의해 닫힙니다. 즉, 함수 내에서 파일을 열고 명시적으로 닫지 않으면 함수가 종료될 때 파일이 자동으로 닫힙니다. 그러나 장기간 실행되는 기능이나 프로그램의 기본 섹션에서 파일을 열었을 수 있습니다. 나머지 쓰기를 강제로 완료하려면 파일을 닫아야 합니다.
파이썬에는 열린 파일과 같은 것들을 정리할 수 있는 컨텍스트 관리자가 있습니다. 식을 변수로 사용하여 양식을 사용할 수식입니다.
>>> with open('relativity', 'wt') as fout: ... fout.write(poem) ...
바로 그거예요. 컨텍스트 관리자 아래의 코드 블록(이 경우, 한 줄)이 완료된 후(일반적으로 또는 상향된 예외에 의해) 파일은 자동으로 닫힙니다.
탐색()으로 위치 변경
읽고 쓸 때 파이썬은 파일 내의 위치를 추적합니다. tell() 함수는 파일 시작 부분의 현재 오프셋(바이트)을 반환합니다. seek() 기능을 사용하여 파일의 다른 바이트 오프셋으로 이동할 수 있습니다. 즉, 마지막 바이트를 읽기 위해 파일의 모든 바이트를 읽을 필요는 없습니다. 마지막 바이트까지 찾고 1바이트만 읽을 수 있습니다.
구직 활동을 위해 tell을 부를 필요는 없다. 나는 단지 그들이 둘 다 같은 오프셋을 보고한다는 것을 보여주고 싶었다.
다음은 파일의 현재 위치에서 찾는 예제입니다.
>>> fin = open('bfile', 'rb')
이 다음 예는 파일이 끝나기 전에 2바이트가 됩니다.
>>> fin.seek(254, 0)
254
>>> fin.tell()
254
이제 1바이트 앞으로 이동합니다.
>>> fin.seek(1, 1)
255
>>> fin.tell()
255
마지막으로 파일 끝까지 읽습니다.
>>> bdata = fin.read()
>>> len(bdata)
1
>>> bdata[0]
255
이러한 함수는 이진 파일에 가장 유용합니다. 텍스트 파일과 함께 사용할 수 있지만, 파일이 ASCII(문자당 1바이트)가 아니면 오프셋을 계산하는 데 어려움이 있을 수 있습니다. 이는 텍스트 인코딩에 따라 달라지며 가장 널리 사용되는 인코딩(UTF-8)은 문자당 바이트 수를 다르게 사용합니다.
구조화된 텍스트 파일
단순 텍스트 파일의 경우 구성 수준은 줄뿐입니다. 때때로, 여러분은 그것보다 더 많은 구조를 원합니다. 프로그램에서 나중에 사용할 수 있도록 데이터를 저장하거나 다른 프로그램으로 데이터를 보낼 수 있습니다.
형식은 여러 가지가 있으며, 다음과 같이 구분할 수 있습니다.
• 탭('\t', 쉼표(',), 세로 막대 등의 구분 기호 또는 구분 기호
('|') CSV(쉼표로 구분된 값) 형식의 예입니다.
• 태그 주위에 '' 및 '''가 있습니다. 예를 들어 XML 및 HTML을 들 수 있습니다.
• 구두점. 예를 들어 자바스크립트 객체 표기법(JSON)이 있습니다.
• 들여쓰기. 예를 들어 YAML이 있습니다. 사용하는 출처에 따라 "YAML은 마크업 언어가 아닙니다. 직접 연구해야 합니다.
• 프로그램 구성 파일과 같은 기타.
이러한 각각의 구조화된 파일 형식은 하나 이상의 파이썬 모듈로 읽고 쓸 수 있다.
CSV
구분된 파일은 종종 스프레드시트 및 데이터베이스의 교환 형식으로 사용됩니다. CSV 파일을 한 번에 한 줄씩 수동으로 읽고 각 줄을 쉼표 구분 기호로 필드로 분할한 다음 목록 및 사전 양자와 같은 데이터 구조에 결과를 추가할 수 있습니다. 그러나 표준 csv 모듈을 사용하는 것이 좋습니다. 이러한 파일을 구문 분석하는 작업은 생각보다 복잡해질 수 있습니다.
• 쉼표 외에 다른 구분 기호를 사용하는 경우도 있습니다. '|' 및 '\t'(탭)가 일반적입니다.
• 일부는 이스케이프 시퀀스가 있습니다. 구분 기호 문자가 필드 내에서 발생할 수 있는 경우 전체 필드에는 따옴표 문자가 있거나 일부 이스케이프 문자가 앞에 있을 수 있습니다.
• 파일의 줄 끝 문자가 다릅니다. Unix는 '\n', Microsoft는 '\r \n', Apple은 '\r'을 사용했지만 지금은 '\n'을 사용합니다.
• 첫 줄에 열 이름이 있을 수 있습니다.
먼저, 각 행에 열 목록이 포함된 행 목록을 읽고 쓰는 방법에 대해 알아보겠습니다.
>>> import csv >>> villains = [
... ['Ernst', 'Blofeld'], ... ] >>> with open('villains', 'wt') as fout: # a context manager ... csvout = csv.writer(fout) ... csvout.writerows(villains)
그러면 다음과 같은 행으로 파일 악당이 생성됩니다.
Doctor,No
Rosa,Klebb
Mister,Big
Auric,Goldfinger
Ernst,Blofeld
이제 다시 읽어보겠습니다.
>>> import csv >>> with open('villains', 'rt') as fin: # context manager
... cin = csv.reader(fin)
... villains = [row for row in cin] # This uses a list comprehension ... >>> print(villains) [['Doctor', 'No'], ['Rosa', 'Klebb'], ['Mister', 'Big'], ['Auric', 'Goldfinger'], ['Ernst', 'Blofeld']]
잠시 목록 이해에 대해 생각해 보십시오. 우리는 리더() 함수에 의해 만들어진 구조를 이용했다. cin 객체에 행을 생성해 루프를 위해 a에서 추출할 수 있습니다.
기본 선택사항과 함께 독서자() 및 작성기()를 사용하여 열은 쉼표로 구분되고 행은 행 피드로 구분됩니다.
데이터는 목록 목록이 아닌 사전 목록일 수 있습니다. 이번에는 새 DictReader() 함수를 사용하여 다음과 같은 열 이름을 지정하여 악당 파일을 다시 읽어보겠습니다.
>>> import csv >>> with open('villains', 'rt') as fin:
새로운 DictWriter() 함수를 사용하여 CSV 파일을 다시 쓰겠습니다. 또한 CSV 파일에 열 이름의 초기 줄을 쓰기 위해 쓰기 헤더()를 호출합니다.
import csv villains = [
{'first': 'Doctor', 'last': 'No'},
{'first': 'Rosa', 'last': 'Klebb'},
{'first': 'Mister', 'last': 'Big'},
{'first': 'Auric', 'last': 'Goldfinger'},
{'first': 'Ernst', 'last': 'Blofeld'},
] with open('villains', 'wt') as fout:
cout = csv.DictWriter(fout, ['first', 'last'])
cout.writeheader()
cout.writerows(villains)
그러면 머리글 줄이 있는 악당 파일이 생성됩니다.
first,last
Doctor,No
Rosa,Klebb
Mister,Big
Auric,Goldfinger
Ernst,Blofeld
이제 다시 읽어보겠습니다. DictReader() 호출에서 필드 이름 인수를 생략하여 파일의 첫 줄(첫 번째, 마지막)에 있는 값을 열 레이블 및 일치하는 사전 키로 사용하도록 지시합니다.
>>> import csv >>> with open('villains', 'rt') as fin:
활성 프로그램은 RAM에 저장된 데이터에 액세스합니다. RAM은 매우 빠르지만 비용이 많이 들고 일정한 전원 공급이 필요합니다. 전원이 꺼지면 메모리의 모든 데이터가 손실됩니다. 디스크 드라이브는 RAM보다 느리지만 용량, 비용 및 전원 코드를 통해 작동한 후에도 데이터를 보존합니다. 따라서, 컴퓨터 시스템에서 엄청난 양의 노력이 디스크와 RAM에 데이터를 저장하는 것 사이에서 최상의 절충을 이루는데 투입되었습니다. 프로그래머로서 디스크와 같은 비휘발성 미디어를 사용하여 데이터를 저장하고 검색하는 지속성이 필요합니다.
이 장에서는 플랫 파일, 구조화된 파일 및 데이터베이스 등 각각 다른 용도에 맞게 최적화된 다양한 유형의 데이터 스토리지에 대해 설명합니다. 입력 및 출력 이외의 파일 작업은 다음내용의 "파일"에서 다룹니다.
또한 이 장에서는 표준 라이브러리와는 별도로 비표준 파이썬 모듈의 예를 보여 주는 첫 번째 장이기도 하다. pip 명령을 사용하여 설치할 수 있습니다. 이 명령은 통증이 없습니다.
File Input/Output
가장 간단한 종류의 지속성은 플랫 파일이라고도 하는 일반 오래된 파일입니다. 이것은 파일 이름 아래에 저장된 일련의 바이트입니다. 파일에서 메모리로 읽고 메모리에서 파일로 씁니다. 파이썬은 이러한 작업을 쉽게 합니다. 그것의 파일 운영은 친숙하고 대중적인 유닉스 계열들을 모델로 했다.
파일을 읽거나 쓰기 전에 파일을 열어야 합니다.
fileobj = open( filename, mode )
다음은 상담 내용에 대한 간단한 설명입니다.
• fileobj는 open()에 의해 반환되는 파일 개체입니다.
• 파일 이름은 파일의 문자열 이름입니다.
• 모드는 파일 형식과 파일로 수행할 작업을 나타내는 문자열입니다.
모드의 첫 번째 문자는 작동을 나타냅니다.
• r은 읽음을 의미한다.
• 쓰는 것을 의미합니다. 파일이 없으면 파일이 만들어집니다. 파일이 있으면 덮어씁니다.
• x는 쓰기(write)를 의미하지만, 파일이 아직 존재하지 않는 경우에만 해당됩니다.
• 파일이 있는 경우 추가(종료 후 쓰기)를 의미합니다.
모드의 두 번째 문자는 파일 형식입니다.
• t(또는 없음)는 텍스트를 의미한다.
• b는 이진수를 의미한다.
파일을 연 후, 당신은 데이터를 읽거나 쓰기 위해 함수를 호출합니다; 이것들은 다음과 같이 표시됩니다.
다음의 예들
마지막으로 파일을 닫아야 합니다.
한 프로그램에서 파이썬 문자열로 파일을 만든 다음 다음 다시 읽어 봅시다.
Write a Text File with write()
어떤 이유에선지, 특수 상대성 이론에 대한 리머릭은 많지 않다. 이것은 우리의 데이터 소스에 대한 것입니다.
>>> poem = '''There was a young lady named Bright,
... Whose speed was far faster than light;
... She started one day
... In a relative way,
... And returned on the previous night.'''
>>> len(poem)
150
다음 코드는 한 번의 통화로 전체 시를 '상대성' 파일에 기록합니다.
>>> fout = open('relativity', 'wt')
>>> fout.write(poem)
150
>>> fout.close()
쓰기() 함수는 기록된 바이트 수를 반환합니다. 인쇄()와 같이 공백이나 새 줄을 추가하지 않습니다. 텍스트 파일로()를 인쇄할 수도 있습니다.
>>> fout = open('relativity', 'wt')
>>> print(poem, file=fout) >>> fout.close()
이 경우 write()를 사용해야 합니까, print()를 사용해야 합니까?라는 질문이 나타납니다. 기본적으로 인쇄()는 각 인수 뒤에 공백을 추가하고 끝에 새 줄을 추가합니다. 앞의 예에서는 상대성 파일에 새로운 선을 추가했다. write()와 같이 인쇄하려면 다음 두 인수를 전달합니다.
• sep(기본값 공백 ' ')
• 끝(기본적으로 새 줄 '\n')
print()는 다른 항목을 통과하지 않는 한 기본값을 사용합니다. 일반적으로 인쇄물에 의해 추가되는 모든 까다로움을 억제하기 위해 빈 줄을 전달합니다.
상대성 파일이 중요한 경우 모드 x를 사용하면 덮어쓰기를 방지할 수 있는지 알아보겠습니다.
>>> fout = open('relativity', 'xt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module> FileExistsError: [Errno 17] File exists: 'relativity'
예외 핸들러와 함께 사용할 수 있습니다.
>>> try: ... fout = open('relativity', 'xt')]
... fout.write('stomp stomp stomp') ... except FileExistsError: ... print('relativity already exists!. That was a close one.') ... relativity already exists!. That was a close one.
Read a Text File with read(), readline(), or readlines()
다음 예제와 같이 전체 파일을 한 번에 후루룩 마실 인수 없이 read()를 호출할 수 있습니다. 대용량 파일을 사용할 때 주의하십시오. 기가바이트 파일은 1기가바이트의 메모리를 소모합니다.
>>> fin = open('relativity', 'rt' )
>>> poem = fin.read()
>>> fin.close()
>>> len(poem)
150
한 번에 반환되는 읽기() 양을 제한하기 위해 최대 문자 수를 제공할 수 있습니다. 한 번에 100자를 읽고 각 조각을 시 문자열에 추가하여 원본을 재구성해 봅시다.
>>> poem = '' >>> fin = open('relativity', 'rt' ) >>> chunk = 100 >>> while True:
... fragment = fin.read(chunk)
... if not fragment:
... break
... poem += fragment
...
>>> fin.close()
>>> len(poem)
150
After you’ve read all the way to the end, further calls to read() will return an empty string (''), which is treated as False in if not fragment. This breaks out of the while True loop.
You can also read the file a line at a time by using readline(). In this next example, we’ll append each line to the poem string to rebuild the original:
>>> poem = '' >>> fin = open('relativity', 'rt' ) >>> chunk = 100 >>> while True:
... fragment = fin.read(chunk)
... if not fragment:
... break
... poem += fragment
...
>>> fin.close()
>>> len(poem)
150
끝까지 읽은 후에는 읽기()에 대한 추가 호출이 빈 문자열('')을 반환하며, 이 문자열은 조각이 아닌 경우 False로 처리됩니다. 이 경우 True 루프가 중단됩니다.
리드라인()을 사용하여 파일을 한 번에 한 줄씩 읽을 수도 있습니다. 다음 예에서는 각 줄을 시 문자열에 추가하여 원본을 재구성합니다.
>>> poem = '' >>> fin = open('relativity', 'rt' ) >>> while True:
>>> len(poem)
150
텍스트 파일의 경우 빈 줄이라도 길이가 1(새 줄 문자)이며 참으로 평가됩니다. 파일을 읽으면 read()와 같은 readline()도 빈 문자열을 반환하며, 이 문자열도 False로 평가됩니다.
텍스트 파일을 읽는 가장 쉬운 방법은 반복기를 사용하는 것입니다. 그러면 한 번에 한 줄씩 반환됩니다. 앞의 예와 비슷하지만 코드가 더 적습니다.
>>> poem = '' >>> fin = open('relativity', 'rt' ) >>> for line in fin: ... poem += line ... >>> fin.close() >>> len(poem) 150
위의 모든 예들은 결국 하나의 현악시를 만들었다. 읽기 행() 호출은 한 번에 한 줄을 읽고 한 줄 문자열 목록을 반환합니다.
>>> for line in lines: ... print(line, end='') ... There was a young lady named Bright, Whose speed was far faster than light; She started one day In a relative way, And returned on the previous night.>>>
우리는 지금까지 텍스트 서식을 거의 무시해 왔다. 2장에는 몇 가지 문자열 정렬 기능이 나와 있으며 코드 예제는 간단한 인쇄() 문을 사용하거나 대화형 인터프리터가 값을 표시하도록 합니다. 하지만 이제는 다양한 형식을 사용하여 데이터 값을 문자열로 변환하는 방법, 즉 문자열 내부에 값을 넣는 방법에 대해 알아보아야 합니다. 이를 통해 보고서 및 기타 출력물을 생성할 수 있으며, 이를 위해 분배가 필요할 수 있습니다.
Python은 문자열을 포맷하는 두 가지 방법, 즉 느슨하게 옛날 스타일과 새로운 스타일이라고 불린다. 두 스타일 모두 Python 2 및 3에서 지원됩니다(Python 2.6 이상의 새로운 스타일). 구식이 더 간단하니까 거기서부터 시작하죠.
이전 스타일(% 포함)
이전 스타일의 문자열 형식에는 형식 문자열% 데이터가 있습니다. 문자열 내부에는 보간 시퀀스가 있습니다. 아래는 가장 간단한 시퀀스가 % 다음에 형식화할 데이터 유형을 나타내는 문자가 있음을 보여준다.
문자열 내부의 %s은 문자열을 보간한다는 의미입니다. 문자열에 나타나는 % 개수는 % 이후의 데이터 항목 개수와 일치합니다. 행위자와 같은 단일 데이터 항목은 % 바로 뒤에 있습니다. (cat, weight)와 같은 튜플(괄호로 묶고 쉼표로 구분)로 여러 데이터를 그룹화해야 합니다.
가중치가 정수임에도 불구하고 문자열 안에 있는 %s이(가) 문자열로 변환했습니다. %와 형식 지정자 사이에 다른 값을 추가하여 최소값을 지정할 수 있습니다.
최대 너비, 정렬 및 문자 채우기: 변수의 경우 정수 n, 플로트 f 및 문자열 s를 정의하겠습니다.
>>>n=42 >>>f=7.03 >>> s = 'string cheese'
기본 너비를 사용하여 형식 지정:
>>>'%d%f%s'%(n,f,s) '42 7.030000 string cheese'
각 변수에 대해 최소 필드 너비를 10자로 설정하고 오른쪽에 정렬하여 왼쪽의 사용되지 않는 부분을 공백으로 채웁니다.
>>> '%10d %10f %10s' % (n, f, s)
'42 7.030000 string cheese'
동일한 필드 너비를 사용하지만 왼쪽으로 정렬합니다.
>>> '%-10d %-10f %-10s' % (n, f, s)
'42 7.030000 string cheese'
이번에는 필드 너비는 같지만 최대 문자 너비는 4이고 오른쪽에 정렬됩니다. 이 설정을 사용하면 문자열이 잘리고 소수점 뒤의 부동자리가 4자리로 제한됩니다.
File "<stdin>", line 1, in <module> ValueError: Precision not allowed in integer format specifier >>> '{0:>10d} {1:>10.4f} {2:>10.4s}'.format(n, f, s) ' 42 7.0300 stri'
마지막 옵션은 채우기 문자입니다. 공백이 아닌 다른 출력 필드를 채우려면 :, 정렬(<, >, ^) 또는 너비 지정 피어 바로 앞에 놓습니다.
>>> '{0:!^20s}'.format('BIG SALE')
'!!!!!!BIG SALE!!!!!!'
Match with Regular Expressions
이전포스팅에서는 간단한 문자열 연산에 대해 다루었다. 입문 정보로 무장한 여러분은 명령행에서 .py로 끝나는 모든 파일 이름을 나열하는 것을 의미하는 ls *.py와 같은 단순한 "와일드카드" 패턴을 사용해 본 적이 있을 것이다.
이제 정규식을 사용하여 더 복잡한 패턴 일치를 살펴볼 차례입니다. 이것들은 우리가 수입할 표준 모듈 re에 제공된다. 일치시킬 문자열 패턴과 일치시킬 소스 문자열을 정의합니다. 단순 일치의 경우 용도는 다음과 같습니다.
result = re.match('You', 'Young Frankenstein')
여기서 'You'가 패턴이고 'Young Frankenstein'이 그 근원이다. 즉, 당신이 만든 끈이다.
want to check. match()는 소스가 패턴으로 시작하는지 여부를 확인합니다.
더 복잡한 일치의 경우 먼저 패턴을 컴파일하여 일치 속도를 높일 수 있습니다.
나중에:
youpattern = re.compile('You')
그런 다음 컴파일된 패턴에 대해 일치를 수행할 수 있습니다.
result = youpattern.match('Young Frankenstein')
match()만이 패턴과 소스를 비교하는 유일한 방법은 아니다. 다음은 사용할 수 있는 몇 가지 다른 방법입니다.
• 검색 결과 첫 번째 일치 항목이 있는 경우 반환됩니다.
• findall은 모든 비반복 일치 항목(있는 경우) 목록을 반환합니다.
• 분할은 패턴과 일치할 때 소스를 분할하고 문자열 조각 목록을 반환합니다.
• 하위 항목에서는 다른 교체 인수를 사용하여 패턴별로 일치하는 소스의 모든 부분을 교체로 변경합니다.
Exact match with match()
'Young Frankenstein'이라는 문자열은 'You'라는 단어로 시작되나요? 설명과 함께 몇 가지 코드가 있습니다.
>>> import re >>> source = 'Young Frankenstein' >>> m = re.match('You', source) # match starts at the beginning of source >>> if m: # match returns an object; do this to see what matched ... print(m.group()) ... You >>> m = re.match('^You', source) # start anchor does the same >>> if m: ... print(m.group()) ... You
'프랭크'는 어때?
>>> m = re.match('Frank', source) >>> if m: ... print(m.group()) ...
이번에는 일치하는()이 반환되지 않았고 if가 인쇄 문을 실행하지 않았습니다. 앞에서 말했듯이 패턴이 원본의 시작 부분에 있을 경우에만 일치()가 작동합니다. 그러나 패턴이 있는 경우 검색()이 작동합니다.
>>> m = re.search('Frank', source) >>> if m: ... print(m.group()) ...
Frank
패턴을 변경해 보겠습니다.
>>> m = re.match('.*Frank', source) >>> if m: # match returns an object ... print(m.group())
...
Young Frank
패턴을 변경합니다.• .는 단일 문자를 의미합니다.
• *는 앞의 모든 것을 의미합니다. 합쳐서 .*는 임의의 수의 문자 행위자(심지어 0)를 의미합니다.
• Frank는 우리가 일치시키고자 했던 문구입니다. match()는 일치하는 문자열을 반환했습니다.프랭크: '젊은 프랭크'.
First match with search()
검색()을 사용하여 .* 와일드카드를 사용하지 않고도 소스 문자열 'Young Frankenstein'의 아무 곳에서나 'Frank' 패턴을 찾을 수 있습니다.
>>> m = re.search('Frank', source) >>> if m: # search returns an object ... print(m.group()) ... Frank
All matches with findall()
위의 예들은 한 가지 일치만 찾았다. 하지만 단일 문자 문자열 'n'의 인스턴스 수를 알고 싶다면 어떻게 해야 할까요?
>>> m = re.findall('n', source) >>> m # findall returns a list ['n', 'n', 'n', 'n'] >>> print('Found', len(m), 'matches') Found 4 matches
'n' 뒤에 오는 글자는 어떤가?
>>> m = re.findall('n.', source)
>>> m
['ng', 'nk', 'ns']
그것이 최종 'n'과 일치하지 않는다는 것을 주목하라. 우리는 'n' 뒤에 오는 문자는 ?:의 옵션이라고 말할 필요가 있습니다.
>>> m = re.findall('n.?', source)
>>> m
['ng', 'nk', 'ns', 'n']
Split at matches with split()
다음 예제에서는 일반 문자열 분할() 메서드와 같이 단순 문자열이 아닌 패턴별로 목록으로 문자열을 분할하는 방법을 보여 줍니다.
>>> m = re.split('n', source) >>> m # split returns a list ['You', 'g Fra', 'ke', 'stei', '']
Patterns: special characters
정규식에 대한 많은 설명은 정규식을 정의하는 방법에 대한 모든 세부 정보에서 시작됩니다. 그건 실수라고 생각해요. 정규 표현은 그 자체로 그리 작지 않은 언어이며, 여러분의 머릿속에 한번에 들어가기에는 너무 많은 세부 사항들을 가지고 있다. 그들은 너무 많은 펑크 표현을 써서 마치 만화 속 캐릭터들이 욕을 하는 것처럼 보인다.
벨트 아래에 있는 식(일치), 검색() 및 findall() 및 sub()을 사용하여 작성에 대한 세부 정보를 살펴보겠습니다. 사용자가 만든 패턴은 다음 함수에 적용됩니다.
기본 사항을 살펴보았습니다.
• 특수하지 않은 문자와 문자 그대로 일치
• 가 있는 \n을 제외한 모든 단일 문자.
• *가 포함된 임의의 숫자(0 포함)
• 선택 사항(0 또는 1)은?
첫째, 특수 문자는 아래에 나와 있습니다.
\d a single digit \D a single non-digit \w an alphanumeric character \W a non-alphanumeric character \s a whitespace character \S a non-whitespace character \b a word boundary (between a\wand a\W, in either order) \B a non-word boundary
파이썬 문자열 모듈에는 테스트에 사용할 수 있는 미리 정의된 문자열 상수가 있습니다. 인쇄 가능한 ASCII 문자(경우, 숫자, 공백 문자, 구두점 등): 100개의 인쇄 가능한 ASCII 문자를 사용합니다.
literal abc expr expr1 or expr2 any character except \n start of source string end of source string zero or one prev
zero or more prev, as many as possible zero or more prev, as few as possible one or more prev, as many as possible one or more prev, as few as possible m consecutive prev
m to n consecutive prev, as many as possible m to n consecutive prev, as few as possible aorborc(same asa|b|c) not (aorborc)
prev if followed by next prev if not followed by next next if preceded by prev next if not preceded by prev
이 예들을 읽으려고 할 때 여러분의 눈은 영구적으로 교차할 수 있습니다. 먼저 소스 문자열을 정의하겠습니다.
>>> source = '''I wish I may, I wish I might
... Have a dish of fish tonight.'''
첫째, 어디서든 소원을 찾으세요.
>>> re.findall('wish', source)
['wish', 'wish']
다음으로, 어디에서나 소원이나 물고기를 찾으세요.
>>> re.findall('wish|fish', source)
['wish', 'wish', 'fish']
시작 부분에서 소원을 찾으세요.
>>> re.findall('^wish', source)
[]
시작 부분에서 내 바람 찾기:
>>> re.findall('^I wish', source)
['I wish']
마지막에 물고기 찾기:
>>> re.findall('fish$', source)
[]
마지막에 물고기 찾기:
마지막으로, 오늘밤 물고기를 찾으세요.
>>> re.findall('fish tonight.$', source)
['fish tonight.']
^ 및 $ 문자를 앵커(anchor)라고 합니다. ^ 검색의 시작 부분에 앵커(anchor)를 지정하고, $는 마침표를 포함하여 줄 끝에 있는 모든 문자와 일치하므로 효과가 있었습니다. 좀 더 정확히 말하자면, 우리는 문자 그대로 일치시키기 위해 점을 탈출해야 한다:
>>> re.findall('fish tonight\.$', source)
['fish tonight.']
w 또는 f를 찾은 다음 ish를 찾습니다.
>>> re.findall('[wf]ish', source)
['wish', 'wish', 'fish']
하나 이상의 w, s 또는 h 런을 찾습니다.
>>> re.findall('[wsh]+', source)
['w', 'sh', 'w', 'sh', 'h', 'sh', 'sh', 'h']
영숫자가 아닌 ght 다음에 오는 영숫자를 찾습니다.
>>> re.findall('ght\W', source)
['ght\n', 'ght.']
소원이 따라오는 것을 찾아라:
>>> re.findall('I (?=wish)', source)
['I ', 'I ']
그리고 마지막으로, I 앞에 소원이 있습니다.
>>> re.findall('(?<=I) wish', source)
[' wish', ' wish']
정규식 패턴 규칙이 파이썬 문자열 규칙과 충돌하는 몇 가지 경우가 있습니다. 다음 패턴은 피시로 시작하는 모든 단어와 일치해야 합니다.
>>> re.findall('\bfish', source) []
왜 안되죠? 이전포스팅에서 논의한 바와 같이, 파이썬은 문자열에 몇 가지 특수 이스케이프 문자 액터를 사용한다. 예를 들어, \b는 문자열의 백스페이스를 의미하지만 정규식의 미니 언어에서는 단어의 시작을 의미합니다. 정규식 문자열을 정의할 때 파이썬의 원시 문자열을 사용하여 이스케이프 문자를 실수로 사용하지 않도록 합니다. 정규식 패턴 문자열 앞에 항상 r 문자를 넣으십시오. 여기서 설명한 것처럼 파이썬 이스케이프 문자를 사용할 수 없습니다.
>>> re.findall(r'\bfish', source)
['fish']
Patterns: specifying match output
일치() 또는 검색()을 사용하면 결과 개체 m에서 모든 일치 항목이 m.group()으로 반환됩니다. 패턴을 괄호로 묶으면 일치 항목이 해당 그룹에 저장되며, 이 중 튜플은 다음과 같이 m.group()으로 사용할 수 있습니다.
>>> m = re.search(r'(. dish\b).*(\bfish)', source)
>>> m.group()
'a dish of fish'
>>> m.groups()
('a dish', 'fish')
이 패턴을 사용하면(?)P<name>expr), 일치 항목을 그룹에 저장합니다.
이름:
>>> m = re.search(r'(?P<DISH>. dish\b).*(?P<FISH>\bfish)', source)
>>> m.group()
'a dish of fish'
>>> m.groups()
('a dish', 'fish')
>>> m.group('DISH')
'a dish'
>>> m.group('FISH')
'fish'
bytes and bytearray
파이썬 3은 다음과 같은 8비트 정수 시퀀스를 도입했으며, 0부터 255까지의 값을 두 가지 유형으로 사용할 수 있다.
• 바이트는 불변입니다. 바이트 튜플처럼 • 바이트 목록처럼 bytray는 변경할 수 있습니다.
블리스트라는 목록으로 시작하여 다음 예제는 바이트 변수인 바이트 변수와 바이트_array라는 바이어레이 변수를 생성합니다.
바이트 값의 표현은 b와 따옴표 문자 다음에 \x02 또는 ASCII charac sequences ters와 같은 16진수 시퀀스로 시작하고 일치하는 따옴표 문자로 끝납니다. 파이썬은 16진수 시퀀스 또는 ASCII 문자를 작은 정수로 변환하지만 유효한 ASCII 인코딩인 바이트 값을 ASCII 문자로 표시합니다.
>>> b'\x61' b'a'
>>> b'\x01abc\xff' b'\x01abc\xff'
다음 예에서는 바이트 변수를 변경할 수 없음을 보여줍니다.
>>> the_bytes[1] = 127
Traceback (most recent call last):
File "<stdin>", line 1, in <module> TypeError: 'bytes' object does not support item assignment
바이트 또는 byterray 데이터를 인쇄할 때 Python은 인쇄할 수 없는 바이트에 \x x를 사용하고 인쇄 가능한 바이트에 ASCII 등가(및 \x0a 대신 \n과 같은 일반적인 이스케이프 문자)를 사용합니다. 다음은_bytes의 인쇄된 표현입니다(한 줄당 16바이트를 표시하도록 수동 참조).
7.1. mystery라는 유니코드 문자열을 만들고 값을 '\U0001f4a9'로 지정합니다. 미스테리를 인쇄하다. 유니코드 이름을 찾아보십시오.
7.2. 이번에는 UTF-8을 사용하여 미스터리를 바이트 변수 pop_bytes로 인코딩합니다. pop_bytes를 인쇄합니다.
7.3. UTF-8을 사용하여 pop_bytes를 문자열 변수 pop_string으로 디코딩한다. pop_string을 인쇄합니다. 팝 스트링이 미스터리와 같은가?
7.4. 다음 시를 구식으로 쓰세요. 'roast beef', 'ham', 'head' 및 'clam' 문자열을 다음 문자열로 대체하십시오.
My kitty cat likes %s,
My kitty cat likes %s,
My kitty cat fell on his %s
And now thinks he's a %s.
7.5. 새로운 서식을 사용해서 양식 편지를 쓰세요. 다음 문자열을 문자로 저장합니다(다음 연습에서 사용합니다).
Dear {salutation} {name},
Thank you for your letter. We are sorry that our {product} {verbed} in your
{room}. Please note that it should never be used in a {room}, especially
near any {animals}.
Send us your receipt and {amount} for shipping and handling. We will send
you another {product} that, in our tests, is {percent}% less likely to
have {verbed}.
Thank you for your support.
Sincerely,
{spokesman}
{job_title}
7.6. 문자열 키 'salutation', 'name', 'product', 'verbed'(과거 시제 동사), 'room', 'animals', '양', 'per cent', 'spokesman', 'job_title'의 값을 가진 response라는 사전을 만드십시오. 반응 값이 포함된 문자를 인쇄합니다.
7.7. 텍스트 작업을 할 때 정규 표현식이 매우 유용합니다. 여러 가지 방법으로 특집 텍스트 샘플에 적용할 것입니다. 이 시는 1866년 제임스 맥킨타이어가 온타리오에서 만들어 국제 순회공연을 위해 보낸 7천 파운드짜리 치즈에 경의를 표하기 위해 쓴 "매머드 치즈 송가"라는 제목의 시입니다. 모든 것을 입력하지 않으려면, 좋아하는 검색 엔진을 사용하여 단어를 잘라내어 파이썬 프로그램에 붙여 넣으십시오. 아니면, 프로젝트 구텐베르크에서 가져와요. 텍스트 문자열을 매머드라고 합니다.
We have seen thee, queen of cheese,
Lying quietly at your ease,
Gently fanned by evening breeze,
Thy fair form no flies dare seize.
All gaily dressed soon you'll go
To the great Provincial show,
To be admired by many a beau
In the city of Toronto.
Cows numerous as a swarm of bees,
Or as the leaves upon the trees,
It did require to make thee please,
And stand unrivalled, queen of cheese.
May you not receive a scar as
We have heard that Mr. Harris
Intends to send you off as far as
The great world's show at Paris.
Of the youth beware of these,
For some of them might rudely squeeze
And bite your cheek, then songs or glees
We could not sing, oh! queen of cheese.
We'rt thou suspended from balloon,
You'd cast a shade even at noon,
Folks would think it was the moon
About to fall and crush them soon.
7.8. 파이썬의 정규식 함수를 사용하려면 re 모듈을 가져옵니다. re.findall()을 사용하여 c로 시작하는 모든 단어를 인쇄합니다.
7.9. c로 시작하는 4글자를 모두 찾아라.
7.10. r로 끝나는 모든 단어를 찾아라.
7.11. 정확히 세 개의 모음을 연속으로 포함하는 모든 단어들을 찾아라.
7.12. unexlify를 사용하여 이 16진수 문자열(페이지에 맞도록 두 개의 문자열에서 조합됨)을 gif라는 바이트 변수로 변환합니다.
이번 포스팅에서는 데이터 길들이기 위한 여러 가지 기술에 대해 알아봅니다. 이들 대부분은 다음과 같은 내장 파이썬 데이터 유형에 관한 것이다.
줄들
텍스트 데이터에 사용되는 유니코드 문자 시퀀스.
바이트와 바이패스
이진 데이터에 사용되는 8비트 정수 시퀀스입니다.
텍스트 문자열
텍스트는 대부분의 독자들에게 가장 익숙한 데이터 유형입니다. 따라서 파이썬에서 텍스트 문자열의 강력한 기능 중 몇 가지를 살펴보겠습니다.
유니코드
지금까지 이 책의 모든 텍스트 예제는 평범한 옛 아스키이다. ASCII는 1960년대에 정의되었는데, 그 당시 컴퓨터는 냉장고 크기였고 계산을 조금 더 잘했다. 컴퓨터 저장의 기본 단위는 바이트이며, 바이트는 8비트에 256개의 고유값을 저장할 수 있다. 여러 가지 이유로 ASCII는 대문자 26개, 소문자 26개, 숫자 10개, 일부 펑크음 기호, 일부 띄어쓰기 문자 및 일부 비인쇄 제어 코드 등 7비트(128개의 고유 값)만 사용했습니다.
불행하게도, 세계는 ASCII가 제공하는 것보다 더 많은 글자를 가지고 있다. 당신은 식당에서 핫도그를 먹을 수 있지만, 카페에서는 절대로 게뷔르츠트라미네르1을 먹지 않는다. 더 많은 문자와 기호를 추가하기 위한 많은 시도가 있었고, 여러분은 때때로 그것들을 볼 수 있을 것입니다. 그 중 몇 가지 예를 들 수 있습니다.
1. 이 와인은 독일에 음라우트가 있는데 프랑스에서는 잃어버려요.
• Latin-1, or ISO 8859-1 • Windows code page 1252
이들 각각은 8비트를 모두 사용합니다. 하지만 그것조차도 충분하지 않습니다. 특히 비유럽 언어가 필요할 때는요. 유니코드는 수학과 다른 분야의 기호와 더불어 세계 모든 언어의 문자를 정의하는 지속적인 국제 표준이다.
유니코드는 플랫폼, 프로그램, 언어와 상관없이 모든 문자에 대해 고유한 번호를 제공합니다.
유니코드 코드 차트 페이지에는 이미지가 있는 현재 정의된 모든 문자 집합에 대한 링크가 있습니다. 최신 버전(6.2)에서는 각각 고유한 이름과 식별 번호를 가진 110,000자 이상의 문자를 정의합니다. 문자는 평면이라고 하는 8비트 집합으로 나뉩니다. 처음 256면은 기본 다국어 평면이다. 자세한 내용은 유니코드 평면에 대한 위키피디아 페이지를 참조하십시오.
파이썬 3 유니코드 문자열
Python 3 문자열은 바이트 배열이 아닌 유니코드 문자열입니다. 이는 일반 바이트 문자열과 유니코드 문자 문자열을 구분하는 파이썬 2와 비교할 때 가장 큰 변화입니다.
유니코드 ID 또는 문자 이름을 알고 있는 경우 파이썬 문자열에서 사용할 수 있습니다. 다음은 몇 가지 예입니다.
• \u 다음에 4개의 16진수2는 유니코드의 256개의 기본 다국어 평면 중 하나에 있는 문자를 지정합니다. 처음 두 개는 평면 번호(00에서 FF)이고 다음 두 개는 평면 내 문자 색인입니다. 평면 00은 오래된 ASCII이며, 평면 내의 문자 위치는 ASCII와 동일합니다.
• 고차원 문자의 경우 비트가 더 필요합니다. Python 이스케이프 시퀀스는 \U 다음에 8개의 16진수 문자가 나옵니다. 가장 왼쪽 문자는 0이어야 합니다.
• 모든 문자에 대해 \N{ 이름 }을(를) 사용하여 표준 이름으로 지정할 수 있습니다. 유니코드 문자 이름 색인 페이지에는 이러한 항목이 나열됩니다.
파이썬 유니코드다 모듈에는 양방향으로 변환하는 기능이 있습니다.
• 검색—대소문자를 구분하지 않는 이름을 사용하고 유니코드 문자를 반환합니다.
• 이름 표시—유니코드 문자를 사용하고 대문자 이름을 반환합니다.
다음 예에서는 Python Unicode char act acter를 사용하여 이름을 조회한 다음 이름(원래 문자와 일치해야 함)에서 문자를 다시 검색하는 테스트 함수를 작성하겠습니다.
value="A", name="LATIN CAPITAL LETTER A", value2="A"
ASCII punctuation: >>> unicode_test('$')
value="$", name="DOLLAR SIGN", value2="$"
A Unicode currency character: >>> unicode_test('\u00a2') value="¢", name="CENT SIGN", value2="¢" Another Unicode currency character: >>> unicode_test('\u20ac') value="€", name="EURO SIGN", value2="€"
잠재적으로 발생할 수 있는 유일한 문제는 텍스트를 표시하는 데 사용하는 글꼴의 제한입니다. 모든 글꼴에 모든 유니코드 문자에 대한 이미지가 없는 경우 일부 자리 표시자 문자가 표시될 수 있습니다. 예를 들어, 딩뱃 글꼴의 기호와 같은 스노우맨의 유니코드 기호는 다음과 같습니다.
카페라는 단어를 파이썬 문자열에 저장하려고 합니다. 한 가지 방법은 파일이나 웹 사이트에서 복사하여 붙여넣기하여 다음 작업을 수행하는 것입니다.
>>> place = 'café'
>>> place
'café'
UTF-8 인코딩을 사용한 원본에서 텍스트에 복사하여 붙여넣었기 때문에 가능했습니다.
최종문자를 어떻게 지정할 수 있습니까? E의 문자 색인을 보면, 급성 라틴 소문자 이름 E의 값이 00E9임을 알 수 있습니다. 방금 사용하던 이름() 및 조회() 함수로 확인해 보겠습니다. 먼저 코드를 입력하여 이름을 가져옵니다.
>>> unicodedata.name('\u00e9') 'LATIN SMALL LETTER E WITH ACUTE'
그런 다음 코드를 조회할 이름을 지정합니다.
>>> unicodedata.lookup('E WITH ACUTE, LATIN SMALL LETTER')
Traceback (most recent call last):
File "<stdin>", line 1, in <module> KeyError: "undefined character name 'E WITH ACUTE, LATIN SMALL LETTER'"
유니코드 문자 이름 색인 페이지에 나열된 이름은 표시에 적합하게 정렬되도록 다시 포맷되었습니다. 이러한 이름을 실제 유니코드 이름(파이썬에서 사용하는 이름)으로 변환하려면 쉼표를 제거하고 쉼표 뒤에 있던 이름의 일부를 처음으로 이동합니다. 따라서 급성 라틴 소문자 E를 급성 라틴 소문자 E로 변경합니다.
>>> unicodedata.lookup('LATIN SMALL LETTER E WITH ACUTE') 'é'
이제 코드 또는 이름으로 문자열 카페를 지정할 수 있습니다.
>>> place = 'caf\u00e9' >>> place 'café' >>> place = 'caf\N{LATIN SMALL LETTER E WITH ACUTE}' >>> place
'café'
앞의 코드 조각에서 문자열에 직접 é를 삽입했지만 다음을 추가하여 문자열을 만들 수도 있습니다.
>>> u_umlaut = '\N{LATIN SMALL LETTER U WITH DIAERESIS}' >>> u_umlaut 'ü' >>> drink = 'Gew' + u_umlaut + 'rztraminer'
>>> print('Now I can finally have my', drink, 'in a', place) Now I can finally have my Gewürztraminer in a café
문자열 렌 함수는 바이트가 아닌 유니코드 문자를 카운트합니다.
>>> len('$') 1 >>> len('\U0001f47b') 1
Encode and decode with UTF-8
일반적인 문자열을 처리할 때 파이썬에서 각 유니코드 문자를 저장하는 방법에 대해 걱정할 필요가 없습니다.
그러나 외부와 데이터를 교환할 때는 두 가지 사항이 필요합니다.
문자 문자열을 바이트로 인코딩하는 방법
문자 문자열로 바이트를 디코딩하는 방법
유니코드에 64,000자 미만의 문자가 있으면 각 유니코드 문자 ID를 2바이트로 저장할 수 있습니다. 불행하게도, 더 있습니다. 각 ID를 3, 4바이트 단위로 인코딩할 수 있지만, 그렇게 하면 공통 텍스트 문자열에 대한 메모리 및 디스크 저장 공간이 3, 4배 증가합니다.
Unix 개발자들에게 친숙한 이름을 가진 Ken Thompson과 Rob Pike는 어느 날 밤 뉴저지의 한 식당에서 UTF-8 동적 인코딩 방식에 서명했다. 유니코드 문자당 1~4바이트를 사용합니다.
• ASC용 1바이트Ⅱ
• 대부분의 라틴어에서 파생된 언어(키릴어는 아님)의 경우 2바이트
• 나머지 다국어 평면의 경우 3바이트
• 일부 아시아 언어와 기호를 포함한 나머지 4바이트
UTF-8은 Python, Linux 및 HTML의 표준 텍스트 인코딩입니다. 빠르고 완전하며 잘 작동합니다. 만약 당신이 코드 전체에 UTF-8 인코딩을 사용한다면, 삶은 다양한 인코딩에 들어가고 나오는 것보다 훨씬 쉬울 것이다.
웹 페이지와 같은 다른 원본에서 복사하여 붙여넣기하여 파이썬 문자열을 만드는 경우, 소스가 UTF-8 형식으로 인코딩되어 있는지 확인하십시오. Latin-1 또는 Windows 1252로 인코딩된 텍스트가 파이썬 문자열로 복사되어 나중에 잘못된 바이트 시퀀스로 돌출되는 것을 볼 수 있습니다.
Encoding
문자열을 바이트로 인코딩합니다. 문자열 인코딩() 함수의 첫 번째 인수는 en coding 부호화 이름입니다. 선택사항은 표 7-1에 제시된 것을 포함한다.
Table 7-1. Encodings
'ascii' Good old seven-bit ASCII 'utf-8' Eight-bit variable-length encoding, and what you almost always want to use
'latin-1' Also known as ISO 8859-1 'cp-1252' A common Windows encoding
UTF-8로 인코딩할 수 있습니다. 유니코드 문자열 '\u2603'을 스노우맨 이름에 할당해 보겠습니다.
>>> snowman = '\u2603'
스노우맨은 내부적으로 저장하는 데 필요한 바이트 수에 관계없이 단일 문자를 가진 파이썬 유니코드 문자열입니다.
>>> len(snowman)
1
다음으로 이 유니코드 문자를 바이트 순서로 인코딩해 보겠습니다.
>>> ds = snowman.encode('utf-8')
앞서 언급했듯이 UTF-8은 가변 길이 인코딩입니다. 이 경우, 3개를 사용했습니다.
단일 눈사람 유니코드 문자를 인코딩하는 바이트:
>>> len(ds) 3 >>> ds b'\xe2\x98\x83'
이제 len()은 ds가 바이트 변수이기 때문에 바이트 수를 반환합니다.
UTF-8 이외의 인코딩을 사용할 수 있지만 인코딩으로 유니코드 문자열을 처리할 수 없는 경우 오류가 발생합니다. 예를 들어, ASCII 인코딩을 사용하는 경우 유니코드 문자도 유효한 ASCII 문자가 아니면 실패합니다.
>>> ds = snowman.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character '\u2603' in position 0: ordinal not in range(128)
인코딩() 함수는 인코딩 예외를 방지하는 데 도움이 되는 두 번째 인수를 사용합니다. 이전 예에서 볼 수 있는 기본값은 '엄격'입니다. ASC가 아닌 경우 유니코드EncodeError가 발생합니다.II 캐릭터. 다른 인코딩도 있습니다. 인코딩되지 않는 것을 버리려면 '무시'를 사용하십시오.
>>> snowman.encode('ascii', 'ignore')
b''
알 수 없는 문자를 대체하려면 '바꾸기'를 사용하십시오.
>>> snowman.encode('ascii', 'replace')
b'?'
유니코드와 같은 파이썬 유니코드 문자 문자열을 만들려면 '백슬래시 바꾸기'를 사용하십시오.
유니코드 이스케이프 시퀀스의 인쇄 가능한 버전이 필요한 경우 이 옵션을 사용합니다. 다음은 웹 페이지에서 사용할 수 있는 문자 엔터티 문자열을 생성합니다.
>>> snowman.encode('ascii', 'xmlcharrefreplace')
b'☃'
디코딩
바이트 문자열을 유니코드 문자열로 디코딩합니다. 일부 외부 소스(파일, 데이터베이스, 웹 사이트, 네트워크 API 등)에서 텍스트를 가져올 때마다 바이트 문자열로 인코딩됩니다. 까다로운 부분은 어떤 인코딩이 실제로 사용되었는지 알기 때문에 이를 역방향으로 실행하고 유니코드 문자열을 가져올 수 있습니다.
문제는 바이트 문자열 자체에 사용된 인코딩을 나타내는 것은 없다는 것이다. 나는 앞서 웹사이트에서 복사와 붙여넣기의 위험에 대해 언급했다. 여러분은 아마도 보통 오래된 ASCII 문자가 있어야 하는 홀수 문자로 웹사이트를 방문한 적이 있을 것이다.
'카페' 값을 사용하여 플레이스라는 유니코드 문자열을 만듭니다.
>>> place = 'caf\u00e9' >>> place 'café' >>> type(place)
int() 함수, list() 함수 또는 dict() 함수를 사용하여 해당 유형의 기본 빈 값을 반환할 수 있습니다. int()는 0을 반환하고 list()는 빈 목록([])을 반환하며 dict()는 빈 사전({})을 반환합니다. 인수를 생략하면 새 키의 초기 값이 없음으로 설정됩니다.
most_common() 함수는 모든 요소를 내림차순으로 반환하거나 카운트가 주어진 경우 최상위 카운트 요소만 반환합니다.
>>> breakfast_counter.most_common()
[('spam', 3), ('eggs', 1)]
>>> breakfast_counter.most_common(1)
[('spam', 3)]
카운터를 결합할 수 있습니다. 먼저, breakfast_counter에 무엇이 있는지 다시 한 번 살펴보겠습니다.
>>> breakfast_counter
>>> Counter({'spam': 3, 'eggs': 1})
이번에는 점심이라고 불리는 새로운 목록과 점심 카운터라고 불리는 카운터를 만들겠습니다.
>>> lunch = ['eggs', 'eggs', 'bacon']
>>> lunch_counter = Counter(lunch)
>>> lunch_counter
Counter({'eggs': 2, 'bacon': 1})
두 카운터를 결합하는 첫 번째 방법은 +를 사용하는 덧셈입니다.
>>> breakfast_counter + lunch_counter
Counter({'spam': 3, 'eggs': 3, 'bacon': 1})
예상하신 대로 -를 사용하여 카운터 하나를 다른 카운터에서 뺍니다.
아침은 안먹고 점심은 안먹어?
>>> breakfast_counter - lunch_counter
Counter({'spam': 3})
좋아요, 그럼 아침으로 먹을 수 없는 점심으로 뭘 먹을 수 있을까요?
>>> lunch_counter - breakfast_counter
Counter({'bacon': 1, 'eggs': 1})
이전의 세트와 마찬가지로 교차로 op‐ erator &:를 사용하여 공통 항목을 얻을 수 있습니다.
>>> breakfast_counter & lunch_counter
Counter({'eggs': 1})
교차로는 공통 요소(계란)를 더 낮은 수로 선택했습니다. 이것은 말이 된다: 아침식사는 계란 한 개만 제공했기 때문에, 그것이 일반적인 계산이다.
마지막으로, 유니언 연산자를 사용하여 모든 항목을 가져올 수 있습니다. |:
>>> breakfast_counter | lunch_counter
Counter({'spam': 3, 'eggs': 2, 'bacon': 1})
'계란'이라는 항목은 다시 두 가지 모두에 공통적이었다. 조합은 덧셈과 달리 인원수를 늘리지 않고 더 큰 숫자를 골랐다.
Order by Key with OrderedDict()
이 책의 초기 장에 있는 많은 코드 예제는 사전의 키 순서를 예측할 수 없다는 것을 보여준다. 키 a, b 및 c는 해당 순서로 추가할 수 있지만 키()는 c, a, b를 반환할 수 있다. 여기 이전포스팅에서 용도를 변경한 예가 있습니다.
>>> quotes = {
... 'Moe': 'A wise guy, huh?',
... 'Larry': 'Ow!',
... 'Curly': 'Nyuk nyuk!', ... } >>> for stooge in quotes: ... print(stooge) ... Larry Curly Moe
OrderedDict()는 키 추가 순서를 기억하고 반복자로부터 동일한 순서로 반환합니다. (키, 값) 튜플 순서에서 OrderedDict를 만들어 보십시오.
>>> from collections import OrderedDict >>> quotes = OrderedDict([
Stack + Queue == deque
데크(데크 발음)는 스택과 큐의 기능을 모두 갖춘 이중 종단 큐입니다. 시퀀스의 양쪽 끝에서 항목을 추가 및 삭제할 때 유용합니다. 여기, 우리는 단어 양쪽 끝에서 중간까지 페일린 드롬인지 알아봅니다. popleft() 함수는 데크에서 맨 왼쪽 항목을 제거했다가 반환합니다. pop()은 맨 오른쪽 항목을 제거했다가 반환합니다. 함께, 그들은 끝에서 중간까지 일을 합니다. 끝 문자가 일치하는 한 중간에 도달할 때까지 계속 터집니다.
>>> def palindrome(word):
...
>>> palindrome('a')
True
from collections import deque dq = deque(word) while len(dq) > 1:
if dq.popleft() != dq.pop(): return False
return True
>>> palindrome('racecar')
True
>>> palindrome('')
True
>>> palindrome('radar')
True
>>> palindrome('halibut')
False
저는 이것을 단순한 데크의 삽화로 사용했습니다. 만약 당신이 빠른 회문 체커를 원한다면, 단지 문자열을 그것의 반대와 비교하는 것이 훨씬 더 간단할 것이다. Python에는 문자열에 대한 역함수가 없지만 여기에 표시된 것처럼 슬라이스로 문자열을 역방향으로 사용할 수 있는 방법이 있습니다.
때때로, 표준 라이브러리는 여러분이 필요로 하는 것을 가지고 있지 않거나, 아주 올바른 방법으로 그것을 하지 않습니다. 오픈 소스, 타사 파이썬 소프트웨어가 전 세계에 걸쳐 있습니다. 좋은 리소스는 다음과 같습니다.
• PyPi (also known as the Cheese Shop, after an old Monty Python skit)
• github
• readthedocs
activestate에서 더 작은 코드 예제를 많이 볼 수 있습니다.
이 책에 있는 거의 모든 파이썬 코드는 모든 내장 및 표준 라이브러리를 포함하는 컴퓨터에 표준 파이썬 설치를 사용합니다. 외부 패키지는 다음과 같은 위치에 있습니다. 1장에서 요청을 언급했으며, 222페이지의 "표준 라이브러리 너머: 요청"에서 자세한 내용을 설명합니다. 부록 D는 다른 많은 너트 앤 볼트 개발 세부사항과 함께 타사 파이썬 소프트웨어를 설치하는 방법을 보여준다.
해야 할 일
5.1. zoo.py이라는 파일을 만듭니다. 여기에서 '매일 9-5 열기' 문자열을 인쇄하는 hours()라는 함수를 정의합니다. 그런 다음 대화형 통역기를 사용하여 동물원 모듈을 가져오고 시간() 기능을 호출합니다.
5.2. 대화형 통역기에서 동물원 모듈을 menagerie로 가져오고 시간() 기능을 호출한다.
5.3. 통역실에 머무르면서 동물원으로부터 직접 시간() 기능을 가져와 전화한다.
5.4. 시간() 기능을 정보로 가져와 호출합니다.
5.5. 키-값 쌍 'a'가 1, 'b': 2, 'c'인 일반 사전을 만듭니다.
3번, 그리고 인쇄하세요.
5.6. 5.5에 나열된 동일한 쌍으로 팬시라고 불리는 OrderedDict를 만들어 인쇄합니다.
일반과 같은 순서로 인쇄되었습니까?
5.7. dict_of_lists라는디폴트딕트를만들어인수목록을전달합니다. 목록을 dict_of_lists['a']로만들고한번의할당으로 'something for a' 값을추가합니다. dict_of_lists['a']를인쇄합니다.