티스토리 뷰

IT/Python

[Python] 파일 읽고 쓰기

Dragonz 2020. 8. 1. 22:08
반응형

 

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

 

with 키워드를 사용한 파일객체 다루기

 

파일의 내용을 읽으려면, f.read(size) 를 호출하는데, 일정량의 데이터를 읽고 문자열 (텍스트모드에서) 이나 바이트열 (바이너리모드에서) 로 리턴한다. size 는 선택인자인데 size 가 생략되거나 음수이면 파일 내용 전체를 읽어서 리턴한다.

파일의 끝에 도달하면 f.read() 는 빈 문자열 ('') 을 리턴한다.

>>> f = open('hamlet.txt')
>>> f.read()

# 파일 내용 출력...

>>> 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.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.write() 를 이용한 파일 쓰기
test.txt 파일에 string 이 write 되었다.

 

다른 형의 객체들은 쓰기 전에 변환이 필요하다.

>>> f = open('test.txt', 'w+')
>>> value = ('the answer', 42)
>>> s = str(value)  # 튜플에서 문자열로 변환
>>> f.write(s)
18
>>> f.close()

 

튜플 객체를 문자열로 변환하여 파일 write
test.txt 파일에 튜플 객체가 문자열로 변환되어 write 되었다.

 

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
댓글
공지사항