파이썬(python) 파일 읽기, 쓰기

파이썬에서 파일을 읽는 방법 또한 매우 간단하다. 기본적으로 파일 읽기나 쓰기를 할 경우 파일을 open해야 한다. 파일을 open함수로 열면 해당되는 파일의 파일 디스크립터를 반환한다. 쉽게 말해 해당파일을 다른 파일과 구별하기 위해서 붙이는 번호라고 생각하시면 된다. 또한 파일을 다 사용한 경우 close를 해야 한다.

 

파일 열기 모드

우리는 단순하게 더블클릭으로 문서파일을 열 수 있다. 하지만 프로그램 내부적으로는 여는 방법에는 몇 가지 방법이 있는데 이것이 열기 모드다.

다음은 C언어에서의 파일 열기 모드인데 파이썬의 경우도 이 모드를 사용한다.

r, w, a, r+, w+, a+ 여섯 가지 모드와 옵션으로 t 또는 b가 붙을 수 있다.

r : 읽기 모드, 파일 없으면 Error

r+: 읽기 또는 쓰기모드, 파일 없으면 Error

w : 쓰기 모드, 파일 없으면 새로 만든다.

w+ : 읽기 또는 쓰기 모드, 파일 없으면 새로 만든다.

a : 파일 추가(FP가 파일의 끝으로 이동)로 쓰기 모드, 파일 없으면 새로 만든다.

a+ : 읽기 또는 파일 추가 모드, 파일 없으면 만든다.

 

t(텍스트 모드로 파일을 연다), b(바이너리 모드로 파일을 연다)

'w+t'는 텍스트 쓰기모드로 파일을 연다는 뜻

 

주의 : w+와 r+은 쓰기 모드 시에 조금 다른 작업을 한다.

w+의 경우 기존 파일에 있던 데이터를 완전 지워버리고 새로 쓴다.

r+의 경우 기존 파일내용은 그대로 두고 그 위에 덮어 쓰기를 한다.

예)

기존 파일 : Hello World!

w+모드로 aa를 입력하면 파일 내용-> aa

r+모드로 aa를 입력하면 파일 내용 -> aallo World!

a+모드로 aa를 입력하면 파일 내용 -> Hello World!aa

 

파일 쓰기

파일을 열고서 쓰기작업을 해보자.

기본 파이썬 디렉토리에 파일이 생성된다. C:\Python27 라면 여기에 파일이 생성된다.

 

라인단위로 쓰기

write(문자열)

writelines(리스트)

의 두개의 함수를 이용하면 된다.

writelines함수는 write와 인수만 다를 뿐 작동은 동일하다. 라인단위로 나누기 위해서는 '\n' 문자를 라인의 끝에 붙여주기만 하면 된다.

 

write함수를 사용하는 경우

write('\n'.join(리스트))의 형태로 사용한다.

join 함수는 리스트를 문자열 형태로 만들어준다. 앞에 '\n'는 각 요소 사이에 삽입할 문자열이다.

 

writelines를 사용하는 경우

함수 이름에 속으면 다음과 같은 결과가 나온다.

write와 writelines는 인수의 자료형만 다를 뿐 하는 일이 똑같다. 그래서 리스트 자료형을 입력할 때 줄 단위로 '\n'를 직접 넣어 주어야 한다.

 

파일 읽기

파일 읽기는 매우 간단하다. read()함수는 위와 같이 통 문자열을 반환한다. 따라서 이 문자열을 리스트로 반환 받고 싶다면 split()함수를 이용한다.

따라서 단어의 개수를 알 수 있다.

 

연습) 단어의 개수

 

라인단위로 읽기

위 예를 라인단위로 읽어보자.

readline

readline함수는 한 라인씩 문자열로 반환한다.

 

readlines

라인들을 리스트로 반환된다. 따라서 len함수로 줄의 수를 알 수 있다.

 

기타 방법

파일 핸들을 가지고 라인단위로 읽을 수 있다.

xreadlines함수로도 가능하다.

이렇게 C언어에 비해서 매우 간단하게 파일을 조작할 수 있다.

이 댓글을 비밀 댓글로
    • zoozoo
    • 2018.09.01 17:11
    출처를 남기고 참고해서 개인블로그에 글을 쓰려고 하는데 괜찮을까요?
    • 수정
    • 2019.12.27 19:27
    안녕하세요... 중간 문장을 수정하거나 삭제하려면 어떻게 해야할까요? 예를들어 텍스트가 10만줄 정도있는데 그중에 hello 라고 쓰여진 줄을 찾아 삭제해야한다면요?
    • 안녕하세요. readline으로 한줄식 읽어나가면서 읽은 내용 중에 'hello'가 있는지 검사한 후 있다면 tell()메소드로 현재파일 포인터의 위치를 반환해서 seek 메소드로 해당 위치로 이동을 한 후 write로 해당 줄을 다시 쓰시면 됩니다. 좀 복잡한 듯 보이지만 쉽습니다.
      참고로 인터넷이나 아니면 "파이썬의 신"이라는 책에 seek, tell에 대한 내용이 있으니 참고하시어 응용하시면 됩니다.