[Python] 파일 입출력

2 분 소요

파이썬 입출력

코드 간단 예제) 파일 열고 닫기

file = open("파일경로", '모드', 인코딩)
file.close()


주의)파일을 열었으면 꼭 닫아야 한다. 안닫으면 파일 내용이 날라갈수도 있다.


모드 (mode)

  • r : 읽기만 가능
  • w : 쓰기 모드. 한번 쓰면 파일의 내용이 다 사라지고 그 위에 새로쓴다. 일종의 덮어쓰기라고 보면된다. 파일이 없으면 새로만든다.
  • a : 파일 이어서 쓰기모드. 파일을 쓸시에 맨 마지막부터 이어서 써진다.
  • t : 텍스트모드. (defualt 값)
  • x : 파일이 없으면 새로만들어서 쓰기모드로 들어간다. 파일이 있으면 에러발생. 파일을 새로만들때 쓰는듯
  • b : 바이너리 모드
  • r+ : 읽고쓰기
  • w+ : 읽고쓰기 (기존파일 삭제)
  • a+ : 파일끝에 추가 (읽기도 가능)
  • rb : 이진파일 읽기 전용
  • wb : 이진파일 쓰기전용
  • ab : 이진파일 끝에 추가 (쓰기 전용)
  • rb+ : 이진파일에 읽고 쓰기
  • wb+ : 이진파일 읽고 쓰기 (기존파일 삭제)
  • ab+ : 이진파일 끝에 추가 (읽기도 가능)

  • 인코딩 : 예를들어 encoding=’UTF8’

모드를 섞어서 쓰는것도 가능하다. rt (읽기, 텍스트모드), rb (읽기, 바이너리모드)

파일 읽기

file.read(self, n: int = -1) -파일 전체를 읽는다. 인수값으로 int 값을 넣으면 넣으만큼의 문자까지 읽는다.

file.readline() -한줄씩 읽음, 한줄씩 string 으로 리턴

file.readlines() -파일 내용 전체 다읽음. 파일 내용 전체를 List 으로 리턴.

예를들어

file.txt
-------
one
two
three
four
--------
이렇게 있다고 가정할때 readlines() 를 쓰면 \n를 기준으로 끊어서 list에 집어넣는다

ex) [‘one\n’, ‘two\n’, ‘three\n’, ‘four’]

파일 쓰기

file.wirte('문자열') -파일에 문자열 내용을 쓴다. 모드를 w 로 했으면 파일내용을 전부다 지우고 새로써지고, a 로 했으면 맨 뒤에 이어서 써진다.

file.writelines(list['문자열1','문자열2', ...])
-매개변수로 리스트를 받고, 리스트 안의 내용들을 쓴다.
써질때는 문자열1문자열2… 이런식으로 전부다 붙어서 써진다.

그 외에 IO 함수

file.seek(self, offset: int, whence: int = 0)
-파일의 커서를 매개변수 만큼의 위치로 이동시킨다. 현재의 커서 위치값 int 를 반환한다. whence : (0 시작기준, 1 현재위치, 2 끝) offset : whence 부터 offset 만큼 커서를 이동시킨다.

ex) file.seek(n) -커서를 n번째 만큼 이동시킨다.

file.seek(n, 1) -커서를 현재 위치에서 n번째 만큼 이동시킨다. -면 앞쪽으로, +면 뒤쪽으로

file.seek(n, 2) -커서를 맨 마지막에서 n 번째 만큼 이동시킨다. n은 보통 음수로 준다.

file.tell()
-현재 커서의 위치를 반환한다.

파이썬에서 txt파일 일정구간 수정하는법

file.seek() 함수로 커서를 이동시킨 다음에 r+ 모드로 저장하면 임의구간이 수정될거 같지만 절대 좋은방법이 아니다.

예를들어

file.txt
-------
one
two
three
four
--------
이렇게 있다고 가정할때

if __name__ == '__main__':
    file = open("./file.txt",'r+')
    file.seek(0)
    string = file.write("change")
    file.close()
    print(string)
cs


하고 실행시키면 결과 값은

file.txt
-------
changewo
three
four
--------

이렇게 나올것이다.

그 이유는 file.txt 를 읽어올때 one\ntwo\nthree\nfour 이렇게 읽어오는데 이거를 changewo\nthree\nfour 이렇게 저장되기 때문이다.

즉, \two의 \nt 부분이 nge 로 덮어 씌어져서 저장된다. 마치 insert 키고 텍스트파일 수정하듯이 뒤에글자들은 덮어씌어져서 저장된다.

파이썬 파일 IO 함수로는 일정구간 write 하는 메소드는 없고

file open 모드 r 로 읽기전용모드로 파일을 읽은다음에

list = file.readlines() 로 전체를 읽어들인다음에

list값을 수정하고

file open 모드 w 로 쓰기전용모드로 파일을 읽고

file.writelines(list) 로 전체를 저장해야된다.

즉 전체를 읽고, 따로 리스트에 저장한다음에, 리스트를 수정하고, 다시 전체를 저장해야된다.