7.2.1. Methods of File Objects

우리는 앞(7.2.Reading and Writing File)에서 파일을 열고, 그것을 f라는 변수에 지정했습니다. f = open('workfile', 'w')

파일의 내용을 읽어오기 위해서는 read()를 사용할 수 있습니다. f.read(size)와 같이 사용하면 됩니다. 이 메소드는 데이터의 양을 읽고 그 값을 스트링(텍스트 모드일 경우) 또는 bytes 개체로(binary 모드일 경우) 알려줍니다. size는 선택사항이며, 숫자로 입력합니다. size가 생략되었거나 음수인 경우 파일의 전체 내용을 읽고 알려줍니다. 파일의 크기가 사용하고 있는 기기의 메모리의 두 배 이상 크면 문제가 생깁니다. 그렇지 않은 경우 최대 크기의 bytes를 읽고 알려줍니다. 파일의 끝에 도달하면 f.read()는 빈 스트링을 반환합니다.

>>> f.read()
'This is the entire file.\n'
>>> f.read()
''

f.readline()은 파일에서 개별적인 한 줄을 읽어옵니다. 줄바꿈을 의미하는\n이 읽어온 문자열의 끝에 추가됩니다. 그리고 \n은 파일의 마지막 문장에서는 생략됩니다. 만약 파일이 줄바꿈 없이 끝난다면 말입니다. 이러한 방식은 값을 명확하게 알 수 있게 해줍니다. 만약 f.readline()이 빈 문자열을 반환한다면, 파일의 끝에 도달한 것입니다. 반면 비어있는 줄은 \n으로 표시됩니다.

>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''

파일에서 여러개의 줄들을 읽어오기 위해 loop를 사용합니다. 메모리에도 효율적이고 빠르며, 간단한 코드로 가능합니다.

>>> for line in f:
...    print(line, end='')
...    
This is the first line of the file. 
Second line of the file.

만약 모든 줄을 읽어오고 싶다면 list(f)또는 f.readlines()를 사용합니다.

f.write(string)은 문자열로 된 내용을 파일에 기록하고 그 글자의 개수를 알려줍니다.

>>> f.write('This is a test\n')
15

다른 타입의 개체들은 기록하기 전 변환을 해야 합니다. 텍스트 모드에서의 문자열이든, binary 모드의 bytes 개체이든 말입니다.

>>> value = ('the answer', 42)
>>> s = str(value) # 튜플을 스트링으로 변환합니다. 
>>> f.write(s)
18

f.tell()은 binary 모드일 때 파일의 시작부분에서 byte 수로 파일의 현 위치를 알려주는 정수를 보여줍니다.(? 원문: f.tells() returns an integer giving the file object's current position in the file represented as number of bytes from the beginning of the file when in binary mode...) 텍스트 모드일 때는 불확실한 수가 나타납니다.

파일의 위치를 바꾸고 싶을 경우 f.seek(offset, from_what)을 사용합니다. 위치는 기준점에 offset 값을 더하여 계산됩니다. 기준점은 from_what 인수로 선택되고요. from_what의 값이 0이면 파일의 시작부터 계산되고, 1이면 파일의 현 위치, 2이면 파일의 마지막을 기준점으로 사용합니다. from_what은 생략할 수 있고, 기본값은 0으로 설정되어 있습니다.

>>> f = open('workfile', 'rb+') # rb+는 read, binary, 수정을 의미한다. open() 문서를 더 읽어보도록 하자.
>>> f.write(b'012345679abcdef')
16
>>> f.seek(5) # 파일의 6번째 byte로 갑니다. 
5
>>> f.read(1) # 파일의 6번째 byte값을 알려준다. 
b'5'
>>> f.seek(-3, 2) # 끝에서 3번째 byte로 이동한다. 
13
>>> f.read(1) # 끝에서 3번째 byte 값을 알려준다.
b'd'

텍스트 파일에서는 (문자열 모드에서 b를 붙이지 않고 열었을 때) 파일의 시작점 부터 수를 세어 이동하는 것만 허용됩니다. (seek(0,2)를 사용하여 파일의 끝을 찾는 것은 가능합니다.) 그리고 offset 값으로는 f.tell()로 찾은 값 또는 0만 사용할 수 있습니다. 다른 offset 값을 사용할 경우 무슨 일이 벌어질 지는 잘 모르겠네요.

작업이 모두 끝났으면 f.close()를 사용합니다. 파일을 닫고 파일이 열려있을 때 사용되던 시스템자원을 비우는 메소드입니다. f.close()를 사용한 뒤에는 파일을 사용하려는 시도가 차단됩니다.

>>> f.close()
>>> f.read()
Traceback (most recent call last):
    File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file

파일 개체를 다룰 때 with키워드를 사용하면 좋습니다. with은 파일의 suite가 끝난 후 적절하게 파일을 닫아줍니다. 문제가 발생한 경우에도 말입니다. with을 사용하는 것이 try-finally 블록을 작성하는 것보다 더 간편합니다.

>>> with open('workfile', 'r') as f:
...    read_data = f.read()
>>> f.closed
True

파일 개체는 몇가지 메소드를 더 가지고 있습니다. isatty(), truncate() 같이 조금 드물게 사용되는 것들입니다. Library Reference에서 자세한 내용을 볼 수 있습니다.

results matching ""

    No results matching ""