데이터를 영구적으로 저장하고 활용하는 능력은 파이썬 프로그래밍의 핵심입니다. 지난 챕터에서 open() 함수와 with 문을 사용해 파일을 열고 닫는 기본적인 방법을 알아보았다면, 이제는 실제로 파일 안의 내용을 읽고 쓰는 방법에 대해 자세히 살펴보겠습니다. 이 챕터에서는 텍스트 파일과 상호작용하는 가장 기본적인 메서드인 read()와 write()를 중심으로 파이썬 파일 입출력의 실용적인 기술을 익히게 될 것입니다.
핵심 요약
텍스트 파일 읽기/쓰기는 파이썬의 핵심 기능 중 하나로, 프로그램이 데이터를 영구적으로 저장하고 처리할 수 있게 합니다. read() 메서드는 파일 전체를 하나의 문자열로 읽고, readline()은 한 줄씩, readlines()는 모든 줄을 리스트로 읽어옵니다. write() 메서드는 문자열을 파일에 쓰고, writelines()는 문자열 리스트를 파일에 씁니다. 파일 모드(‘w’는 쓰기, ‘a’는 추가)와 인코딩 설정이 중요하며, with open() 구문을 사용해 파일 자원을 안전하게 관리하는 것이 필수입니다.
텍스트 파일 읽기: read(), readline(), readlines() 메서드
파일에서 데이터를 읽는 것은 프로그램이 외부 정보를 활용하는 첫걸음입니다.
파이썬에서 텍스트 파일을 읽는 방법은 크게 세 가지 주요 메서드로 나뉩니다. 각 메서드는 파일을 읽는 방식이 다르므로, 상황에 맞춰 적절한 것을 선택해야 합니다.
read(): 파일 전체를 한 번에 읽기
read() 메서드는 파일의 모든 내용을 하나의 거대한 문자열로 읽어옵니다. 저의 현업 경험을 비춰보면, 설정 파일이나 작은 로그 파일처럼 파일 크기가 크지 않을 때 유용하게 사용하곤 합니다. 파일 전체 내용을 한 번에 메모리에 로드하기 때문에, 파일 크기가 매우 크다면 시스템 성능에 영향을 줄 수 있습니다.
코드 예시: read()
# 먼저 테스트용 파일을 생성합니다.
with open('example.txt', 'w', encoding='utf-8') as f:
f.write('안녕하세요, 파이썬!\n')
f.write('이것은 파일 읽기 테스트입니다.\n')
# 이제 파일을 읽어봅니다.
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
이 코드는 example.txt 파일을 만들고 내용을 쓴 다음, 다시 파일을 열어 read() 메서드로 전체 내용을 읽어 출력합니다.
readline(): 파일 내용을 한 줄씩 읽기
readline() 메서드는 파일에서 한 줄만 읽어와 문자열로 반환합니다. 파일의 다음 줄로 자동으로 넘어가는 특징이 있어, 대용량 파일을 처리할 때 메모리 효율적으로 한 줄씩 분석해야 할 때 아주 유용합니다. 특히 반복문과 함께 사용하면 파일의 모든 줄을 순차적으로 처리할 수 있습니다.
코드 예시: readline()
with open('example.txt', 'r', encoding='utf-8') as f:
line1 = f.readline()
line2 = f.readline()
print(f"첫 번째 줄: {line1.strip()}") # .strip()으로 개행 문자 제거
print(f"두 번째 줄: {line2.strip()}")
위 예제에서는 readline()을 두 번 호출하여 파일의 첫 번째와 두 번째 줄을 각각 읽어옵니다. 각 줄 끝에는 개행 문자(\n)가 포함될 수 있으므로, .strip() 메서드를 사용해 제거하는 경우가 많습니다.
readlines(): 모든 줄을 리스트로 읽기
readlines() 메서드는 파일의 모든 줄을 읽어와 각각의 줄을 요소로 하는 문자열 리스트를 반환합니다. 만약 파일의 모든 줄을 메모리에 저장하여 리스트 조작이 필요할 때 적합합니다. 예를 들어, 어떤 데이터 파일을 읽어와 각 줄을 데이터 포인트로 활용하고 싶을 때 유용합니다.
코드 예시: readlines()
with open('example.txt', 'r', encoding='utf-8') as f:
all_lines = f.readlines()
print(all_lines)
for line in all_lines:
print(line.strip())
이 코드는 example.txt 파일의 모든 줄을 리스트 형태로 가져온 후, for 반복문을 사용하여 각 줄을 순서대로 출력합니다.
텍스트 파일 쓰기: write(), writelines() 메서드
데이터를 파일에 저장하는 것은 프로그램의 결과를 영구적으로 보존하는 중요한 기능입니다.
파이썬에서 파일을 쓰는 방법은 크게 write()와 writelines() 두 가지 메서드를 사용합니다. 이 메서드들은 텍스트 데이터를 파일에 기록하는 데 사용되며, 파일 열기 모드에 따라 기존 내용을 덮어쓰거나 추가할 수 있습니다.
write(): 문자열 하나를 파일에 쓰기
write() 메서드는 하나의 문자열을 파일에 기록합니다. 이 메서드는 쓴 문자열의 길이를 반환합니다. write()를 사용할 때 주의할 점은 개행 문자(\n)를 직접 넣어주어야 줄 바꿈이 일어난다는 것입니다. 제가 자동화 스크립트를 만들 때, 특정 정보를 한 줄씩 로그 파일에 기록해야 할 때 이 메서드를 자주 사용합니다.
코드 예시: write()
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('첫 번째 줄입니다.\n')
f.write('두 번째 줄을 추가합니다.\n')
f.write('숫자도 쓸 수 있어요: ' + str(123) + '\n') # 숫자는 문자열로 변환해야 합니다.
이 예제는 output.txt 파일을 생성(‘w’ 모드)하고 세 줄의 텍스트를 기록합니다. 숫자를 쓰기 전에 str() 함수를 사용하여 문자열로 변환하는 것에 주목하세요. 2023년 기준으로 파이썬은 파일에 문자열만 직접 쓸 수 있기 때문입니다.
writelines(): 문자열 리스트를 파일에 쓰기
writelines() 메서드는 문자열 리스트(또는 다른 반복 가능한 문자열 객체)를 파일에 한꺼번에 기록합니다. 각 리스트 요소 끝에 개행 문자(\n)를 직접 추가해야 줄 바꿈이 일어난다는 점은 write()와 동일합니다. 여러 줄의 데이터를 한 번에 파일에 저장하고 싶을 때 효율적입니다.
코드 예시: writelines()
lines_to_write = ['이것은 첫 줄입니다.\n', '다음은 두 번째 줄이고요.\n', '마지막 줄입니다.\n']
with open('list_output.txt', 'w', encoding='utf-8') as f:
f.writelines(lines_to_write)
# 파일을 읽어서 확인
with open('list_output.txt', 'r', encoding='utf-8') as f:
print(f.read())
이 코드는 문자열 리스트 lines_to_write의 내용을 list_output.txt 파일에 한 번에 기록합니다. 역시 각 요소에 \n을 명시적으로 추가했습니다.
자주 발생하는 문제와 해결 팁
파일 입출력 과정에서 흔히 겪는 문제들을 미리 알아두면 시간을 절약할 수 있습니다.
- 인코딩 문제: 한글이 깨져서 보인다면
open()함수의encoding매개변수를 확인하세요. 윈도우에서는'cp949'나'euc-kr'이 기본일 수 있지만,'utf-8'을 명시하는 것이 가장 좋습니다. 제가 만든 대부분의 자동화 스크립트에서는'utf-8'을 표준으로 사용합니다. - 개행 문자:
write()나writelines()로 파일을 쓸 때 줄 바꿈이 필요하면 반드시'\n'을 문자열 안에 넣어주어야 합니다. 파이썬은 자동으로 줄을 바꿔주지 않습니다. - 파일 닫기:
with open(...)구문을 사용하면 파일이 자동으로 닫히므로,f.close()를 명시적으로 호출할 필요 없이 안전하게 파일을 다룰 수 있습니다. 저 역시 `with` 문을 사용하지 않아 파일 핸들이 닫히지 않아 고생했던 경험이 있습니다.
실전 예제: 간단한 메모장 프로그램 만들기
배운 내용을 바탕으로 간단한 메모장 기능을 구현해 보며 실용적인 활용법을 익혀보겠습니다.
이 예제는 사용자로부터 입력을 받아 파일에 저장하고, 저장된 내용을 다시 읽어와 출력하는 단순한 메모장 프로그램입니다. 실제 현업에서 로그를 남기거나 간단한 스크립트의 설정을 저장하는 방식과 유사합니다.
def memo_app():
memo_file = 'my_memo.txt'
# 메모 쓰기
print("\n--- 새로운 메모 작성 ---")
memo_content = input("메모 내용을 입력하세요 (저장 후 종료하려면 'quit' 입력): ")
if memo_content.lower() != 'quit':
with open(memo_file, 'a', encoding='utf-8') as f:
f.write(memo_content + '\n')
print(f"'{memo_file}'에 메모가 저장되었습니다.")
# 메모 읽기
print("\n--- 저장된 메모 확인 ---")
try:
with open(memo_file, 'r', encoding='utf-8') as f:
print("\n<메모 내용>")
print(f.read())
except FileNotFoundError:
print("아직 저장된 메모가 없습니다.")
if __name__ == '__main__':
memo_app()
이 코드는 my_memo.txt 파일을 사용하여 메모를 추가하고 읽어오는 기능을 합니다. 'a' 모드를 사용했기 때문에 기존 내용에 이어서 새로운 메모가 추가됩니다. 또한 FileNotFoundError를 처리하여 아직 파일이 없을 때도 프로그램이 안정적으로 동작하도록 했습니다. 이처럼 작은 기능을 조합하는 것이 실제 프로그램의 시작입니다.
결론
이번 챕터에서는 파이썬에서 텍스트 파일을 읽고 쓰는 핵심 메서드인 read(), readline(), readlines(), write(), writelines()에 대해 자세히 살펴보았습니다. 데이터를 파일에 저장하고 불러오는 능력은 모든 프로그래머에게 필수적인 기술이며, 여러분이 만드는 프로그램의 활용도를 비약적으로 높여줄 것입니다. 이 기초를 바탕으로 할 일 목록 관리 프로그램처럼 더 복잡한 파일 입출력 프로젝트에도 도전해 보시기 바랍니다.
FAQ
Q1: read()와 readlines() 중 어떤 것을 사용해야 하나요?
A1: 파일의 모든 내용을 하나의 문자열로 한 번에 처리하고 싶다면 read()를, 각 줄을 개별적인 리스트 요소로 다루고 싶다면 readlines()를 사용합니다. 대용량 파일의 경우 readline()을 반복문과 함께 사용하여 메모리 부하를 줄이는 것이 좋습니다.
Q2: 파일에 쓸 때 왜 항상 '\n'을 넣어줘야 하나요?
A2: 파이썬의 write() 및 writelines() 메서드는 프로그래머가 명시적으로 개행 문자를 넣어주어야만 줄 바꿈을 인식합니다. 이는 텍스트 파일을 더 세밀하게 제어하기 위함이며, 자동 줄 바꿈 기능은 제공되지 않습니다.
Q3: 파일 쓰기 모드 ‘w’와 ‘a’의 차이점은 무엇인가요?
A3: ‘w’ 모드(write)는 파일을 열 때 기존 내용을 모두 지우고 새롭게 작성합니다. 파일이 없으면 새로 생성합니다. 반면 ‘a’ 모드(append)는 파일의 끝에 내용을 추가하며, 기존 내용은 유지합니다. 파일이 없으면 새로 생성하는 것은 동일합니다.
참고 자료
- [1] Python 공식 튜토리얼 — 입력과 출력 — https://docs.python.org/ko/3/tutorial/inputoutput.html
- [2] Python 표준 라이브러리 — 내장 함수 — https://docs.python.org/ko/3/library/functions.html
