파이썬코딩

파이썬코드쓰기()를 사용하여 이진 파일 쓰기

모든 문자열에 'b'를 포함하면 파일이 이진 모드로 열립니다. 이 경우 문자열 대신 바이트를 읽고 씁니다.

이진 시가 없기 때문에 0에서 255까지의 256바이트 값만 생성합니다.

 

  >>> bdata = bytes(range(0, 256))

    >>> len(bdata)

    256

 

이진 모드에서 쓰기 위한 파일을 열고 모든 데이터를 한 번에 씁니다.

 

   >>> fout = open('bfile', 'wb')

    >>> fout.write(bdata)

    256

    >>> fout.close()

 

다시 쓰기()는 기록된 바이트 수를 반환합니다. 텍스트와 마찬가지로 이진 데이터를 청크로 쓸 수 있습니다.

 

    >>> fout = open('bfile', 'wb')

    >>> size = len(bdata)

    >>> offset = 0

    >>> chunk = 100

>>> while True:
... if offset > size:
... break
... fout.write(bdata[offset:offset+chunk]) ... offset += chunk
...
100
100
56
>>> fout.close() 

읽기()를 사용하여 이진 파일 읽기

이 방법은 간단합니다. 'rb'로 열기만 하면 됩니다.

 

 >>> fin = open('bfile', 'rb')

    >>> bdata = fin.read()

    >>> len(bdata)

    256

>>> fin.close()

Close Files Automatically by Using with

열어본 파일을 닫지 않은 경우 더 이상 참조되지 않은 후 파이썬에 의해 닫힙니다. 즉, 함수 내에서 파일을 열고 명시적으로 닫지 않으면 함수가 종료될 때 파일이 자동으로 닫힙니다. 그러나 장기간 실행되는 기능이나 프로그램의 기본 섹션에서 파일을 열었을 수 있습니다. 나머지 쓰기를 강제로 완료하려면 파일을 닫아야 합니다.

파이썬에는 열린 파일과 같은 것들을 정리할 수 있는 컨텍스트 관리자가 있습니다. 식을 변수로 사용하여 양식을 사용할 수식입니다.

 

>>> with open('relativity', 'wt') as fout: ... fout.write(poem)
... 

바로 그거예요. 컨텍스트 관리자 아래의 코드 블록(이 경우, 한 줄)이 완료된 후(일반적으로 또는 상향된 예외에 의해) 파일은 자동으로 닫힙니다.

 

탐색()으로 위치 변경

읽고 쓸 때 파이썬은 파일 내의 위치를 추적합니다. tell() 함수는 파일 시작 부분의 현재 오프셋(바이트)을 반환합니다. seek() 기능을 사용하여 파일의 다른 바이트 오프셋으로 이동할 수 있습니다. 즉, 마지막 바이트를 읽기 위해 파일의 모든 바이트를 읽을 필요는 없습니다. 마지막 바이트까지 찾고 1바이트만 읽을 수 있습니다.

이 예에서는 앞에서 작성한 256바이트 이진 파일 'bfile'을 사용합니다.

 

    >>> fin = open('bfile', 'rb')

    >>> fin.tell()

    0

 

파일이 끝나기 전에 seek()를 1바이트까지 사용합니다.

 

>>> fin.seek(255) 

255 

파일 끝까지 읽기:

    >>> bdata = fin.read()

    >>> len(bdata)

    1

    >>> bdata[0]

255 

seek()는 현재 오프셋도 반환합니다.

두 번째 인수를 사용하여 seek()를 호출할 수 있습니다. seek(오프셋, 오리진):

• 오리진이 0(기본값)이면 처음부터 오프셋 바이트로 이동합니다.

• 발신지가 1인 경우 현재 위치에서 오프셋 바이트로 이동

• 원본이 2인 경우, 끝 부분에 상대적인 오프셋 바이트로 이동합니다.

다음 값은 표준 OS 모듈에도 정의되어 있습니다.

 

  • >>> import os >>> os.SEEK_SET 0
    >>> os.SEEK_CUR 1
        >>> os.SEEK_END
  •     2
  •  

마지막 바이트는 다른 방식으로 읽을 수 있었습니다.

 

  •     >>> fin = open('bfile', 'rb')
  •  

파일 종료 전 1바이트:

 

  >>> fin.seek(-1, 2)

    255

    >>> fin.tell()

    255

 

파일 끝까지 읽기:

 

  >>> bdata = fin.read()

    >>> len(bdata)

    1

    >>> bdata[0]

255 

구직 활동을 위해 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: 

  •     ...      cin = csv.DictReader(fin)
  •  
  • ...  villains = [row for row in cin] ...>>> print(villains)[{'last': 'No', 'first': 'Doctor'}, {'last': 'Klebb', 'first': 'Rosa'}, {'last': 'Big', 'first': 'Mister'}, {'last': 'Goldfinger', 'first': 'Auric'}, {'last': 'Blofeld', 'first': 'Ernst'}]

파이썬코딩 데이터 저장위치

활성 프로그램은 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.>>> 

처음 줄에는 이미 줄이 있었기 때문에 우리는 인쇄물에게 자동 줄이 생기지 않도록 했다. 마지막 줄은 그렇지 않아 마지막 바로 뒤에 대화형 프롬프트 >>> 발생하였습니다.