파이썬 가이드 12 파일 입출력
프로그래밍을 하다 보면 데이터를 저장하거나 외부 데이터를 불러와야 할 때가 많습니다. 사용자의 설정을 저장하고, 게임 점수를 기록하고, 데이터 분석을 위해 로그 파일을 읽는 등 파일 처리는 매우 중요한 부분이죠. 파이썬은 이러한 파일 입출력(File I/O) 작업을 아주 쉽고 직관적으로 처리할 수 있도록 도와줍니다.
파일 열기: open() 함수
가장 먼저 해야 할 일은 파일을 여는 것입니다. 파이썬에서는 open()이라는 내장 함수를 사용합니다. open() 함수는 기본적으로 두 개의 인자, 즉 파일 경로(이름)와 파일 열기 모드를 받습니다.
file = open("my_file.txt", "w")
<!-- -->
# ... 파일 작업 수행 ...
file.close() # 작업이 끝나면 반드시 닫아주어야 합니다.
파일 열기 모드(Mode)
파일 열기 모드는 파일을 어떤 목적으로 열 것인지를 지정합니다. 자주 사용되는 모드는 다음과 같습니다.
- 'r' (Read): 파일을 읽기 위한 모드입니다. 모드를 지정하지 않으면 기본값으로 사용됩니다. 파일이 존재하지 않으면 오류가 발생합니다.
- 'w' (Write): 파일에 내용을 쓰기 위한 모드입니다. 파일이 이미 존재한다면 기존 내용은 모두 삭제되고 새로 작성됩니다. 파일이 존재하지 않으면 새로 생성합니다.
- 'a' (Append): 파일에 내용을 추가하기 위한 모드입니다. 파일이 존재하면 기존 내용의 맨 끝에 새로운 내용을 덧붙입니다. 파일이 존재하지 않으면 새로 생성합니다.
- 'b' (Binary): 텍스트 파일이 아닌 이미지나 동영상 같은 바이너리 파일을 다룰 때 사용합니다.
rb,wb와 같이 다른 모드와 함께 사용합니다. - '+': 읽기와 쓰기를 모두 할 수 있도록 해줍니다.
r+,w+와 같이 사용됩니다.
파일에 내용 쓰기: write()
'w' 또는 'a' 모드로 파일을 연 후 write() 메서드를 사용하면 파일에 내용을 작성할 수 있습니다.
<!-- -->
# 'w' 모드로 파일을 엽니다. 기존 내용은 사라집니다.
file = open("hello.txt", "w")
file.write("Hello, Python!\n")
file.write("Welcome to file I/O.")
file.close()
hello.txt 파일을 열어보면 write()로 작성한 두 줄의 문자열이 저장된 것을 확인할 수 있습니다. \n은 줄바꿈을 의미하는 특수 문자입니다.
파일 내용 읽기: read(), readline(), readlines()
이번에는 파일에 저장된 내용을 읽어오는 방법을 알아봅시다. 'r' 모드로 파일을 열고 다양한 읽기 메서드를 사용할 수 있습니다.
먼저, 방금 만들었던 hello.txt 파일을 읽어보겠습니다.
read(): 파일 전체 내용 읽기
read() 메서드는 파일의 전체 내용을 하나의 문자열로 반환합니다.
file = open("hello.txt", "r")
content = file.read()
print(content)
file.close()
출력 결과:
Hello, Python!
Welcome to file I/O.
readline(): 한 번에 한 줄씩 읽기
readline() 메서드는 파일의 내용을 한 줄씩 읽어옵니다. 여러 번 호출하면 다음 줄을 차례대로 읽습니다.
file = open("hello.txt", "r")
line1 = file.readline()
print(f"첫 번째 줄: {line1.strip()}") # .strip()은 양쪽 공백과 줄바꿈 문자를 제거합니다.
line2 = file.readline()
print(f"두 번째 줄: {line2.strip()}")
file.close()
출력 결과:
첫 번째 줄: Hello, Python!
두 번째 줄: Welcome to file I/O.
readlines(): 모든 줄을 리스트로 읽기
readlines() 메서드는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 반환합니다.
file = open("hello.txt", "r")
lines = file.readlines()
print(lines)
<!-- -->
# for 문과 함께 사용하면 편리합니다.
for line in lines:
print(line.strip())
file.close()
출력 결과:
['Hello, Python!\n', 'Welcome to file I/O.']
Hello, Python!
Welcome to file I/O.
더 안전하고 편리하게: with 문
파일 작업 후에는 close()를 호출하여 파일을 꼭 닫아주어야 합니다. 파일을 닫지 않으면 시스템 자원이 낭비되거나 변경 사항이 제대로 저장되지 않을 수 있습니다. 하지만 매번 close()를 신경 쓰는 것은 번거롭고 잊어버리기 쉽습니다.
이때 with 문을 사용하면 이 문제를 아주 간단하게 해결할 수 있습니다. with 블록이 끝나면 파이썬이 자동으로 파일을 닫아주기 때문입니다.
<!-- -->
# with 문을 사용한 파일 읽기
with open("hello.txt", "r") as file:
content = file.read()
print(content)
<!-- -->
# with 블록이 끝나면 file.close()가 자동으로 호출됩니다.
<!-- -->
# with 문을 사용한 파일 쓰기
lines_to_write = ["Python is fun.\n", "File I/O is easy."]
with open("python_is_fun.txt", "w") as file:
file.writelines(lines_to_write) # writelines는 리스트의 문자열을 파일에 씁니다.
이처럼 with 문을 사용하면 코드가 더 간결해지고 안정성도 높아지므로 파일 작업 시에는 항상 with 문을 사용할 것을 강력히 추천합니다.
정리
- 파일을 열 때는
open("파일이름", "모드")함수를 사용합니다. - 모드:
'r'(읽기),'w'(쓰기),'a'(추가)가 가장 기본적입니다. - 쓰기:
write()메서드를 사용합니다. - 읽기:
read()(전체),readline()(한 줄),readlines()(모든 줄을 리스트로) 메서드가 있습니다. - 자동으로 파일을 닫아주는
with open(...) as ...:구문을 사용하는 것이 가장 좋은 방법입니다.