파이썬에서 파일 다루기

주로 장고로 웹서버만 만드는 것만 하다보니 파일을 읽고 쓰는 python기능을 자주 쓸 일이 없었다. 그런데 실제로 일을 시작하니 간혹 사용 할 일이 있더라….

읽고 쓰는건 간단한 일인데 모드가 자꾸 기억나지 않아서 쓸 때마다 구글을 검색해야 하는 번잡함을 피하고자 블로그에 기록해놓으려고 한다.

일단 이와 관련해서 한글로 너무나 잘 정리 된 글이 있어서 소개한다. - http://thrillfighter.tistory.com/310

그리고 파이썬 공식문서의 open 메소드 설명 - https://docs.python.org/3/library/functions.html#open

파일을 여는데에는 여러가지 모드와 옵션이 존재한다. 여기서는 여러가지 모드옵션을 정리한다. (왜냐면 내가 필요하니까)

open 메소드는 아래와 같이 사용된다.

file_object = open(file_name, [access_mode], [buffering])

(출처 tutorialpoint)

아래는 사용할 수 있는 모드의 종류다.

파이썬의 모드는 C언어의 standard library function인 fopen()과 같다. 따라서 해당 내용을 참고한다면 좀더 풍부하게 python의 open()을 사용할 수 있을 것 같다. 예를 들어 파이썬 공식 문서에도 r+w+와 같이 ‘+’를 사용하는 것을 상세하게 소개하진 않는다.(내가 그렇게 느낀다… 물론 내가 영어를 잘 못알아 먹은 경우의 수도 있다.)

모드

Character Meaning
'r' open for reading (default) / 파일이 없을 경우 에러
'w' open for writing, truncating the file first / 파일이 없으면 새로 만든다.
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
'U' universal newlines mode (deprecated)

옵션

Character Meaning
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)

예시

# 쓰기모드 + 텍스트옵션
write_text = open(test.txt, wt)

# 읽기모드 + 바이너리옵션
read_binary = open(test.txt, rt)

w+, r+, a+의 차이점

모드 설명
w+ 기존 파일에 있던 데이터를 완전히 지우고 새로 작성
r+ 기존 파일에 있던 데이터 위에 덮어씌움 (파일이 없으면 에러를 뿜는다)
a+ 기존 파일 가장 뒷자리부터 작성

ex) 기존 파일에 “hello world”라는 내용이 있고 “aa”를 입력하는 경우 각 모드별 차이

모드 결과
w+ “aa”
r+ “aallo world”
a+ “hello world”

마지막으로 open 메서드에 나오는 buffering에 대하여

버퍼는 메모리라고 생각하면 되는데, 간단히 말해 os가 제공해 주는 인터페이스를 통해 파일을 읽어오는게 아니라 메모리에 올려서 읽어오는 것을 말한다. open메서드에서 buffering을 설정 하는 것은 메모리에 얼마만큼의 단위로 올려서 가져올지 정하는 것 이다. (사실 나도 개념적으로만 이해하고 있지 실제로 잘 사용해보지는 않았다.)

스택오버플로우의 답변에 의하면 os시스템을 통해서 raw stream으로 가져오는 것 보다 메모리에 올려 파일을 읽어오는 것이 더 빠르다고 한다.. (os 시스템에서 raw stream으로 가져오는 것은 대기 시간이 길다고 함) 아마 설정한 buffer chunk 단위로 메모리에 미리 올려 놓기 때문에 더 빠른 것 같다.

출처 : 파이썬 공식문서, 블로그, stackoverflow