[Python] 파일 입출력
파이썬 입출력
코드 간단 예제) 파일 열고 닫기
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) 로 전체를 저장해야된다.
즉 전체를 읽고, 따로 리스트에 저장한다음에, 리스트를 수정하고, 다시 전체를 저장해야된다.