파이썬 파일 open
- 2019. 9. 16. 12:09
파이썬 파일 다루기
파이썬 open() 함수 변경 사항
Version 3.3
- opener 매개 변수 추가
- 'x'모드 추가
- IOError에서 OSError로 변경
- 'x' 모드로 open시 파일이 존재하면 FileExistsError 발생
Version 3.4
- 파일 상속 불가
- 'u'모드 사용 중지 / Version 4.0에서 제거 예정
Version 3.5
- 시스템 콜이 인터럽트 되고 시그널 처리가 에러를 발생시키지 않으면 open() 함수는 InterruptedError를 발생하는 대신 시스템 호출을 재시도
- namereplace 오류 처리기 추가
Version 3.6
- os.PathLike를 구현하는 객체를 지원
파이썬 open() 모드
모드 | 설명 |
r | 읽기 전용 (Default) |
w | 파일 덮어쓰기 |
x | 독점 파일 생성용, 파일이 존재할 경우 에러 발생 |
a | 파일 덧붙이기 |
b | 바이너리 모드 |
t | 텍스트 (Default) |
+ | 갱신용 (읽기/쓰기) 모드 |
※ 주의 사항 ※
w모드로 파일 open시 기존 파일 내용은 초기화됩니다. 때문에 w모드 사용에 신중해야 합니다.
파이썬 파일 open 방법 (2가지)
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
captainbin_open.txt 파일을 읽기 전용으로 open 한다고 가정하겠습니다.
파이썬 파일 open 첫 번째 방법
fp = open('captainbin_open.txt', 'r')
print(fp.read())
fp.close()
파이썬 파일 open 두 번째 방법
with open('captainbin_open.txt','r') as fp:
print(fp.read())
차이점이 보이시나요? 첫 번째 방법은 파일 핸들링한 후 더 이상 사용하지 않을 때 꼭 close()를 해주어야 합니다. 두 번째 방법은 with문을 사용해 파일을 핸들링했는데 close()가 보이지 않습니다. with문이 종료될 때 파이썬에서 자동으로 close()합니다.
대부분 close를 신경 쓰지 않아도 되는 두 번째 방법을 많이 선호합니다. 하지만 늘 그렇듯이 구현하는 로직에 따라 가독성이 좋은 방법을 선택하시는 것이 좋습니다.
파이썬 파일 객체 메서드 및 속성
종류 | 설명 |
file.close() | 파일 객체 닫기 |
file.closed | 파일이 닫혔는지 bool형태로 반환 |
file.encoding | 텍스트 모드에서 사용되고 있는 인코딩 방식을 반환 |
file.flush() | 버퍼의 내용을 파일에 기록 |
file.mode | 파일 객체의 모드 조회 |
file.name | 파일 객체의 파일명 |
file.newlines | 파일에서 사용하는 라인개행 출력 |
file.read([size]) | 입력한 size만큼 파일 읽기, size가 없으면 전체 읽기 |
file.readable() | 파일 객체가 읽기 가능한지 bool 형태로 반환 |
file.readline([size]) | 입력한 size만큼 파일 읽기, size가 없으면 라인개행 단위로 한 라인씩 읽기 |
file.seek([offset],[whence]) |
파일 포인터 위치 지정 [offset] = 0과 file.tell()의 반환 값만 유효 [whencd] 값
|
file.seekable() | 파일 포인터 위치 지정 가능 여부를 bool 형태로 반환 |
file.tell() | 현재 파일 포인터의 위치를 반환 |
file.truncate([position]) | 지정한 position 이후의 파일 내용 삭제 |
file.writable() | 파일 객체에 쓰기 가능한지 bool형태로 반환 |
file.write(str) | str 문자를 파일에 기록 |
file.write(lines) | 입력한 lines을 파일에 기록 |
예제를 통한 파이썬 파일객체 메서드 및 속성 확인
# 파일 open
>>> cap_fp = open("captainbin_open.txt","r")
# 파일명 확인
>>> cap_fp.name
'captainbin_open.txt'
# 모드 확인
>>> cap_fp.mode
'r'
# 인코딩 형식 확인
>>> cap_fp.encoding
'cp949'
# 읽기 가능 유무 확인
>>> cap_fp.readable()
True
# 쓰기 가능 유무 확인
>>> cap_fp.writable()
False
# 파일 객체 close 유무 확인
>>> cap_fp.closed
False
>>> cap_fp.close()
>>> cap_fp.closed
True
# 읽기 쓰기 모드로 open
>>> cap_fp = open("captainbin_open.txt","a+")
>>> cap_fp.writable()
True
# 파일 쓰기
>>> print("안녕하세요", file=cap_fp)
>>> print("captainbin 입니다", file=cap_fp)
# 파일 포인터 위치
>>> cap_fp.tell()
31
# 파일 포인터 앞으로 이동
>>> cap_fp.seek(0)
0
# 파일 전부 읽기
>>> cap_fp.read()
'안녕하세요\ncaptainbin 입니다\n'
# write메서드와 writelines메서드를 이용한 파일 쓰기
>>> cap_fp.write("블로그를 ")
5
>>> cap_fp.writelines("방문해 ")
>>> cap_fp.writelines(["주","셔","서"," ","감","사","합","니","다."])
# 내용 확인
>>> cap_fp.seek(0)
0
>>> cap_fp.read()
'안녕하세요\ncaptainbin 입니다\n블로그를 방문해 주셔서 감사합니다.'
# "."이 빠져서 "\n블로그를~~~" 삭제
>>> cap_fp.truncate(29) 29
>>> cap_fp.seek(0) 0
>>> cap_fp.read()
'안녕하세요\ncaptainbin 입니다'
# 라인 개행을 포함한 문자열 파일 쓰기
>>> cap_fp.write(".\n블로그를 방문해 주셔서 감사합니다.")
21
# read() 메서드 size만큼 읽기
>>> cap_fp.read(5)
'안녕하세요'
# readline() 메서드에 size를 입력해도 라인개행까지 읽음
>>> cap_fp.readline(200)
'\n'
>>> cap_fp.readline(200)
'captainbin 입니다.\n'
>>> cap_fp.seek(0)
0
>>> cap_fp.readline(3)
'안녕하'
>>> cap_fp.readline(3)
'세요\n'
>>> cap_fp.readline(3)
'cap'
>>> cap_fp.readline(3)
'tai'
>>> cap_fp.readline(3)
'nbi'
>>> cap_fp.readline(3)
'n 입'
>>> cap_fp.readline(3)
'니다.'
>>> cap_fp.readline(3)
'\n'
# 현재 파일 포인터 값 확인하기
>>> cap_fp.seek(0,1)
32
>>> cap_fp.tell()
32
# 파일 포인터 파일의 맨 처음으로 이동하기
>>> cap_fp.seek(0,0)
0
>>> cap_fp.tell()
0
# 파일 포인터 파일의 맨 마지막으로 이동하기
>>> cap_fp.seek(0,2)
66
>>> cap_fp.tell()
66
# 문자개행 처리된 파일 내용 출력하기
>>> print(cap_fp.read())
안녕하세요
captainbin 입니다.
블로그를 방문해 주셔서 감사합니다.
# 파일 객체 파일 닫힘 유무 확인
>>> cap_fp.closed
False
>>> cap_fp.close()
>>> cap_fp.closed
True