티스토리 뷰
open() 은 파일 객체를 리턴하고 두 개의 인자를 주는 방식이 보통 사용된다. (open(filename, mode)
MODE
- r : 읽기모드, 파일이 존재하지 않으면 error
- r+ : 읽기 또는 쓰기모드, 파일이 존재하지 않으면 error
- w : 쓰기모드, 파일이 존재하지 않으면 생성
- w+ : 읽기 또는 쓰기모드, 파일이 존재하지 않으면 생성
- a : 파일추가(파일포인터가 파일의 끝으로 이동)로 쓰기모드, 파일이 존재하지 않으면 생성
- a+ : 읽기 또는 파일추가모드, 파일이 존재하지 않으면 생성
OPTION
- t : 텍스트모드로 파일을 open
- b : 바이너리모드로 파일을 open
파일객체를 다룰 때 with 키워드를 사용하는 것이 좋다. 프로그램 중간에 예외가 발생하더라도 파일이 정상적으로 colse 되기 때문이다. with 를 사용하면 같은 역할을 하는 try - finally 블록을 쓰는 것에 비해 훨씬 짧다. with 키워드를 사용하지 않으면, f.close() 를 호출하여 파일을 닫고 자원을 즉시 반납해야 한다. 명시적으로 파일을 닫지 않으면, 파이썬의 가비지 컬렉터가 결국 파일을 닫게 되지만 한동안 파일이 열린 상태로 남아있게 된다.
>>> with open('hamlet.txt') as f :
... read_data = f.read()
...
>>> # 파일이 정상적으로 닫혔는지 확인
>>> f.closed
True
파일의 내용을 읽으려면, f.read(size) 를 호출하는데, 일정량의 데이터를 읽고 문자열 (텍스트모드에서) 이나 바이트열 (바이너리모드에서) 로 리턴한다. size 는 선택인자인데 size 가 생략되거나 음수이면 파일 내용 전체를 읽어서 리턴한다.
파일의 끝에 도달하면 f.read() 는 빈 문자열 ('') 을 리턴한다.
>>> f = open('hamlet.txt')
>>> f.read()
# 파일 내용 출력...
>>> f.read()
''
f.readline() 은 파일에서 한 줄만 읽는다. 개행문자(\n) 는 문자열의 끝에 보존되고, 파일의 마지막 줄에서만 생략된다. 즉, f.readline() 가 빈 문자열을 리턴하면 파일의 끝에 도달한 것이다. (빈 줄은 '\n', 하나의 개행문자만을 포함하는 문자열로 리턴한다.)
>>> f = open('test.txt')
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file.'
>>> f.readline()
''
파일객체를 루핑하여 한 줄씩 읽을 수도 있다.
>>> f = open('test.txt')
>>> for line in f :
... print(line, end='')
...
This is the first line of the file.
Second line of the file.
f.write(string) 은 string 의 내용을 파일에 쓰고, 출력된 문자들의 개수를 리턴한다.
>>> f = open('test.txt', 'w+')
>>> f.write('This is a test\n')
15
>>> f.close()
다른 형의 객체들은 쓰기 전에 변환이 필요하다.
>>> f = open('test.txt', 'w+')
>>> value = ('the answer', 42)
>>> s = str(value) # 튜플에서 문자열로 변환
>>> f.write(s)
18
>>> f.close()
f.tell() 은 파일의 현재 위치를 가리키는 정수를 리턴하는데, 바이너리 모드의 경우 파일의 처음부터 바이트수로 표현되고 텍스트 모두의 경우는 불확실한 숫자가 리턴된다. 파일 객체의 위치를 변경하려면 f.seek(offset, whence) 를 사용한다. 위치는 기준점에 offset 을 더해서 계산된다. 기준점은 whence 로 선택한다. whence 값이 0이면 파일의 처음부터 측정하고, 1이면 현재 파일 위치를 사용, 2는 파일의 끝을 기준점으로 사용한다. whence 는 생략될 수 있고, 기본값은 0 이다.
>>> f = open('test.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # 파일의 여섯번째 바이트로 포인터를 이동
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # 파일의 끝에서 세번째 바이트 앞으로 포인터를 이동
13
>>> f.read(1)
b'd'
텍스트 파일에서는 파일의 시작에 상대적 위치 변경만 허용되고, 올바른 offset 값은 f.tell() 이 리턴한 값과 0 뿐이다. 그 외의 값은 정의되지 않은 결과가 발생할 수 있다.
END
'IT > Python' 카테고리의 다른 글
[Python] 예외 처리 프로그램 (0) | 2020.09.11 |
---|---|
[Python] 예외 처리 (0) | 2020.08.02 |
[Python] 출력 (0) | 2020.08.01 |
[Python] 모듈 (0) | 2020.08.01 |
[Python] 루프 테크닉 (0) | 2020.07.17 |