활성 프로그램은 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()는 다른 항목을 통과하지 않는 한 기본값을 사용합니다. 일반적으로 인쇄물에 의해 추가되는 모든 까다로움을 억제하기 위해 빈 줄을 전달합니다.
>>> fout = open('relativity', 'wt')
>>> print(poem, file=fout, sep='', end='') >>> fout.close()
소스 문자열이 큰 경우 소스가 완료될 때까지 청크를 쓸 수도 있습니다.
>>> fout = open('relativity', 'wt')
>>> size = len(poem)
>>> offset = 0
>>> chunk = 100
>>> while True:
... if offset > size:
... break
... fout.write(poem[offset:offset+chunk]) ... offset += chunk
...
100
50
>>> fout.close()
이것은 첫 번째 시도에서 100자를 썼고 마지막 50자를 다음 시도에서 썼다.
상대성 파일이 중요한 경우 모드 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
위의 모든 예들은 결국 하나의 현악시를 만들었다. 읽기 행() 호출은 한 번에 한 줄을 읽고 한 줄 문자열 목록을 반환합니다.
>>> fin = open('relativity', 'rt' ) >>> lines = fin.readlines()
>>> fin.close()
>>> print(len(lines), 'lines read') 5 lines read
>>> 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.>>>
처음 네 줄에는 이미 새 줄이 있었기 때문에 우리는 인쇄물에게 자동 새 줄이 생기지 않도록 했다. 마지막 줄은 그렇지 않아 마지막 줄 바로 뒤에 대화형 프롬프트 >>>가 발생하였습니다.