파일 입출력
파이썬에서 파일 입출력(File I/O)은 외부 파일(텍스트 파일, 이진파일등)의 데이터를 읽거나 쓰는 기능으로 파일 입출력은 크게 1)열고 2)읽고/쓰고 3)닫기의 세 단계로 구성된다.
파일 열기 - open()
파일을 읽을때는 표준 입출력 함수인 open함수를 사용한다.
함수 원형은 아래와 같다.
open(
file, # 필수
mode='r',
buffering=-1,
encoding=None,
errors=None,
newline=None,
closefd=True,
opener=None
)
open 함수에서는 첫번째 파라미터인 파일 경로, 파일명에 대한 부분만이 필수 값이다.
아래는 각각의 전달인자들이 의미하는 바를 표현한다.
1. file(필수값)
열고자 하는 파일의 경로나 파일명을 문자열로 작성한다.
open("sample.txt")
open("C:/data/test.csv")
2. mode : 기본값은 'r'
파일을 열때 어떤 모드로 열지를 지정하는 옵션으로 주된 설정 값은
- "r" : 읽기 모드(파일이 반드시 존재해야만 한다 - 파일이 없으면 FileNotFoundError 발생 )
- "w": 쓰기 모드(파일이 없으면 생성하고 있다면 내용을 모두 지우고 덮어쓴다, 항상 파일을 비우고 시작한다)
- "a" : 추가 모드(파일이 없으면 생성하고 있다면 끝 부터 append 하기에 기존 내용을 보존한채로 추가하고 싶을때 사용한다)
- "x" : 베타적 생성 모드(파일이 반드시 없어야만 한다. 파일이 있다면 FileExistsError 오류를 발생시킨다)
- "b" : 바이너리 모드 (r , w, s, a, x 모드와 같이 사용되며 텍스트가 아닌 바이너리 데이터(사진, 동영상, 이미지 등)를 읽고 쓸 때 사용되며 반환되는 값은 bytes 타입이다.) - ex) rb, wb ...
- "t" : 텍스트 모드(기본값으로 생각가능하다. 텍스트 파일을 읽고 쓰는데 사용되며 보통 rt, wt와 같이 사용한다(생략 가능하기에 r, w로만 써도 rt, wt와 같은 기능을 함))
- "+": 읽기/쓰기 겸용(update) 모드(읽기와 쓰기를 동시에 할 수 있게함 ex) r+ : 파일이 존재하며 읽기 쓰기가가능 / r+ : 파일이 존재하며 읽기 쓰기가 가능 w+ : 파일이 없으면 생성, 있으면 덮어쓰고 읽기와 쓰기가 가능 a+ : 파일이 없으면 생성하고 있으면 추가만 가능(읽기/쓰기)
open("sample.txt", "r") # 읽기
open("sample.txt", "w") # 쓰기
open("sample.txt", "a") # 추가
open("sample.txt", "rb") # 바이너리 읽기
open("sample.txt", "w+") # 읽기/쓰기 겸용
3. buffering: 기본값은 -1
버퍼링 정책을 지정하는 옵션으로 1을 넣으면 줄 단위로 버퍼링(텍스프 파일) 을 걸고 0을 넣으면 버퍼링이 없게(바이너리 모드만) 할 수 있다
음수나 생략을 하면 기본값인 -1을 사용한다.
open("sample.txt", "w", buffering=1)
4. encoding: 기본값 None
파일을 읽거나 쓸 때 사용할 인코딩을 지정하는 옵션(텍스트 모드에서만 해당)
사용할 수 있는 인코딩 값은 대표적으로 utf-8, cp949, euc-kr 등이 있다.
open("sample.txt", "r", encoding="utf-8")
5. errors: 기본값 None
인코딩/디코딩 중 발생하는 에러에 대한 처리 방식을 지정한다.(텍스트 모드에서만 해당)
encoding 옵션을 지정한 경우 파일 내부에 지정한 인코딩 방식으로 해석할 수 없는 문자가 있을때(디코딩 에러)나 문자열을 파일에 쓸 때(인코딩 에러 발생시) 처리 방식을 errors 옵션으로 지정할 수 있다.
주로 사용되는 옵션은 strict, ignore, replace, backslashreplace가 있다
- strict(기본값): 사용자가 errors의 옵션을 None으로 지정할 경우(errors를 설정을 안하더라도), 내부적으로 strict를 사용하며 해당 옵션은 인코딩/디코딩시 에러가 발생하면 바로 예외를 발생시킨다
- ignore: 읽을 수 없는 문자는 모두 무시하고 건너뛴다.
- replace: 깨지는 문자는 '?' 등으로 대체되어 저장된다.
- backslashreplace: \xXX 또는 \uXXXX 형태의 문자열로 표시됨
보통에 실무에서는 에러로 인해 파일 처리가 멈추면 안되기에 ignore이나 replace로 설정해서 사용한다고한다.
6. newline: 기본값 None
줄바꿈 문자 처리 방식을 지정한다.
주로 사용되는 옵션은 None(OS 기본값), ''(변환x), '\n', '\r', '\r\n' 등이 있다.
open("sample.txt", "w", newline="\n")
7. closefd: 기본값 True
해당 값은 거의 쓸일이 없다
8. opener: 기본값 None
파일을 여는 방식을 커스터마이즈 하는 함수를 지정한다.
해당 옵션도 특수한 경우에만 사용하고 거의 쓸일이 없다.
def custom_opener(path, flags):
return os.open(path, flags, 0o777)
open("sample.txt", "w", opener=custom_opener)
7번 8번은 조금 나중에 더 알아보자..
파일 쓰기 - write()
write()함수는 open()함수로 만든 파일 객체에 값을 쓸때 사용되는 함수로 아래와 같은 원형을 가지고 있다.
파일객체.write(문자열)
파일에 문자열을 한 번에 기록하는 함수로 반드시 문자열만 전달해야한다.
줄바꿈을 원할때는 문자열의 끝에 서식문자 \n을 붙여야 한다.
파일 읽기 - read() / readline() / readlines()
1. read()
read() 함수 또한 open() 함수로 만든 파일 객체에 값을 읽을때 사용되는 함수로 아래와 같은 원형을 가지고 있다.
파일객체.read([크기])
파일의 전체 내용을 한 번에 읽어서 문자열로 반환하며 전달인자로 크기를 전달하면 그 바이트/문자 만큼 읽어 온다
2. readline()
파일에서 한 줄 씩 읽어서 문자열로 반환하며 줄바꿈 문자가 포함되어 있다.
파일객체.readline()
3. readlines()
파일 전체를 줄 단위로 읽어서 리스트로 반환하며 각 줄이 리스트의 한 요소가 된다.
파일객체.readlines()
파일 닫기 - close()
파일 작업이 종료된 후에 파일을 닫는 함수로 자원을 해제해주는 함수기에 필수적으로 진행해야한다.
with문(컨텍스트 매니저)
open, close를 따로 지정할 필요 없이 파일을 자동으로 열고 닫아주는 구문으로 with문 내부에 open이 붙어 있기에 사실은 close() 함수를 따로 호출할 필요가 없어지는 구문이라고 보면 된다.
with문의 원형은 아래와 같다.
with open(파일명, 모드, ...) as 파일객체:
# 파일 작업
# with문을 벗어나면 자동으로 close() 실행됨