[python] 파일 다루기 – 열기/읽기/쓰기/with/encoding

이번 글에서는 python에서 파일을 읽고 쓰는 법에 대해 알아보겠습니다.

파일 열기

파일 읽기/쓰기를 하기 위해선 우선 파일을 열어야 합니다.
파일을 열기 위해서는 아래의 open 함수를 사용합니다.

open(file path, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

보통 간단하게 파일을 읽고 쓸 땐 open 함수 인자 중 file path, mode, encoding 인자를 사용하는 경우가 많습니다.

아래는 open 함수에 대한 샘플 코드입니다.

# open 샘플
f = open("C:/test.txt")
f = open("C:/test.txt", "w")
f = open("C:/test.txt", "wr", encoding="utf-8")

그리고 open 함수를 실행했을 경우 close 함수를 호출하여 파일을 닫아줘야합니다.

# close
f = open("C:/test.txt")
f.close()
mode

파일을 열 때 읽기를 할건지 쓰기를 할건지, 아니면 읽기/쓰기 모두 할건지를 정하려면 mode 인자에 설정된 값에 따라 달라집니다.
읽기 모드에서는 쓰기를 할 수 없고, 쓰기 모드에서는 읽기를 할 수 없습니다.
더 나아가 파일을 열 때 바이너리 모드도 있습니다.

아래 표는 mode에 입력되는 값과 그에 대한 설명입니다.

CharacterMeaning
‘r’읽기 (기본값)
‘w’쓰기. 존재하는 파일 있으면 새로 생성
‘x’파일 생성. 이미 존재하는 파일 있으면 fail
‘a’쓰기. 존재하는 파일이 있으면 파일에 끝에 추가
‘t’텍스트 모드 읽기(기본값)
‘b’이진(binary) 파일 읽기
‘+’업데이트(읽기/쓰기)
파일 쓰기 - write, writelines

파일에 쓰기를 하기 위해선 write 함수를 사용합니다.

아래 코드를 실행하면 해당 경로에 파일이 생성됩니다.

# write
f = open("C:\\test.txt", "w")
text = """123
가나다
abc"""
f.write(text)
f.close()

아래와 같이 writelines 함수를 사용할 수도 있습니다.

# writelines
f = open("C:\\test.txt", "w")
text = ["123\n", "가나다\n", "abc"]
f.writelines(text)
f.close()
파일 읽기 - readline, readlines, read

파일의 내용을 읽는 방법 중에 readline 함수를 사용하는 방식 입니다.

readline 함수를 사용하면 한 줄씩 읽어옵니다.

# readline
f = open("C:\\test.txt", "r")
while True:
    line = f.readline()
    if line == '':
        break
    print(line, end="")
f.close()

readlines 함수를 사용하면 파일 전체를 읽어옵니다. 반환되는 형식은 리스트 입니다.

# readlines
f = open("C:\\test.txt", "r")
lines = f.readlines()
print(lines)
for line in lines:
    print(line, end="")
f.close()

read 함수를 사용하면 파일 전체를 읽어옵니다. 반환되는 형식은 문자열입니다.

# read
f = open("C:\\test.txt", "r")
text = f.read()
print(text, end="")
f.close()

with

파일을 열면 항상 파일을 닫아줘야 한다고 했습니다.
실수로 파일을 닫지 않게 되면 다음 open 함수 수행 시 제대로 수행되지 않을 수 있습니다.
이럴 때 open된 파일을 자동으로 close 해주려면 with문과 같이 사용하면 됩니다.

# with
with open("C:\\test.txt", "r") as f:
    lines = f.readlines()
    print(lines)
    for line in lines:
        print(line, end="")

encoding

encoding 인자에 아무것도 입력되지 않으면 플랫폼에 의존적(platform-dependent)인 encoding을 사용합니다.
플랫폼에 의존적인 encoding은 locale.getpreferredencoding(False) 함수를 사용해서 알 수 있습니다.
제 PC 환경은 Windows10 인데 cp949로 나오네요.

# encoding
import locale
print(locale.getpreferredencoding(False))

encoding에 입력되는 값은 ANSI, UTF-8, EUC-KR 등이 있으며 파일엔 잘 입력되어 있는데 파이썬에서 읽었을 때 한글 깨진다거나 할 때 이 encoding에 입력되는 값을 변경해보시면 됩니다.
여기도 참고하시길 바랍니다.

이상으로 파일 열기/읽기/쓰기에 대해 알아보았습니다.