파이썬에서 파일 입출력은 프로그램이 외부 데이터와 상호작용하는 중요한 방법 중 하나입니다. 파일을 열고, 데이터를 읽거나 쓰고, 마지막으로 파일을 닫는 과정을 통해 다양한 작업을 수행할 수 있습니다. 이번 포스트에서는 파이썬의 파일 입출력에 대해 자세히 알아보고, 예제를 통해 실제로 어떻게 사용하는지 살펴보겠습니다. 파일 입출력의 기본 개념부터 고급 기능까지 모두 다루어 보겠습니다.
1. 파일 열기: open()
함수
파일을 사용하기 위해서는 먼저 해당 파일을 열어야 합니다. 파이썬에서는 open()
함수를 사용하여 파일을 엽니다. 이 함수는 두 개의 주요 인자를 받습니다:
- 파일 경로: 읽거나 쓸 파일의 위치를 지정합니다.
- 모드: 파일을 어떻게 사용할 것인지를 정의합니다.
주요 모드 종류
'r'
: 읽기 모드 (기본값) - 파일의 내용을 읽습니다.'w'
: 쓰기 모드 - 파일에 새로운 내용을 작성하며, 기존 내용은 삭제됩니다.'a'
: 추가 모드 - 파일의 끝에 새로운 내용을 추가합니다.'b'
: 바이너리 모드 - 바이너리 형식으로 데이터를 처리할 때 사용됩니다.'x'
: 배타적 생성 모드 - 파일이 이미 존재하면 오류를 발생시킵니다.'t'
: 텍스트 모드 (기본값) - 텍스트 형식으로 데이터를 처리합니다.
예제: 파일 열기
# 'example.txt' 파일을 읽기 모드로 엽니다.
file = open('example.txt', 'r')
파일 경로 지정
파일 경로는 절대 경로나 상대 경로로 지정할 수 있습니다. 절대 경로는 파일 시스템의 루트부터 시작하는 전체 경로를 의미하며, 상대 경로는 현재 작업 디렉토리를 기준으로 한 경로입니다.
# 절대 경로 예제
file = open('/Users/username/Documents/example.txt', 'r')
# 상대 경로 예제
file = open('data/example.txt', 'r')
2. 파일 읽기: read()
, readline()
, readlines()
파일이 열린 후에는 그 안에서 데이터를 읽을 수 있습니다. 파이썬은 파일에서 데이터를 읽기 위해 다양한 메서드를 제공합니다.
주요 메서드
read(size)
: 전체 또는 특정 크기의 데이터를 반환합니다.size
를 지정하지 않으면 전체 파일을 읽습니다.readline()
: 한 줄씩 데이터를 반환합니다.readlines()
: 모든 줄을 리스트 형태로 반환합니다.
예제: 파일 읽기
# 전체 내용 출력하기
content = file.read()
print(content)
# 한 줄씩 출력하기
line = file.readline()
while line:
print(line)
line = file.readline()
# 모든 줄 리스트 형태로 가져오기
lines = file.readlines()
print(lines)
파일 포인터 이해하기
파일을 읽을 때 파일 포인터가 현재 위치를 나타냅니다. read()
메서드를 사용하면 파일 포인터가 파일의 끝으로 이동합니다. 파일 포인터를 다시 처음으로 이동시키려면 seek()
메서드를 사용할 수 있습니다.
# 파일 포인터를 처음으로 이동시키기
file.seek(0)
content = file.read()
print(content)
3. 파일 쓰기: write()
, writelines()
파일에 데이터를 쓰는 작업은 write()
또는 writelines()
메서드를 통해 수행됩니다. 쓰기 모드('w'
)나 추가 모드('a'
)로 파일을 열어야 합니다.
예제: 파일 쓰기
# 'output.txt' 파일을 쓰기 모드로 엽니다.
output_file = open('output.txt', 'w')
# 문자열 작성하기
output_file.write("안녕하세요!\n")
output_file.write("파이썬 입출력을 배우고 있습니다.")
# 여러 줄 작성하기
lines_to_write = ["첫 번째 줄\n", "두 번째 줄\n"]
output_file.writelines(lines_to_write)
파일에 데이터 추가하기
추가 모드('a'
)를 사용하면 파일의 끝에 새로운 내용을 추가할 수 있습니다.
# 'output.txt' 파일을 추가 모드로 엽니다.
with open('output.txt', 'a') as file:
file.write("\n이 줄은 추가된 내용입니다.")
4. 파일 닫기: close()
파일 작업이 끝난 후에는 반드시 열린 파일을 닫아야 합니다. 이를 통해 시스템 자원을 해제하고, 다른 프로세스가 해당 파일에 접근할 수 있도록 합니다. close()
메서드를 사용하여 파일을 닫을 수 있습니다.
예제: 파일 닫기
file.close() # example.txt를 닫습니다.
output_file.close() # output.txt를 닫습니다.
5. with
문을 사용한 안전한 파일 처리
파일을 열고 닫는 과정에서 실수로 파일을 닫지 않으면 시스템 자원이 낭비될 수 있습니다. 이를 방지하기 위해 with
문을 사용할 수 있습니다. with
문은 파일을 열고 작업이 끝나면 자동으로 파일을 닫아줍니다.
예제: with
문 사용
# 파일 읽기
with open('example.txt', 'r') as file:
content = file.read()
print(content)
# 파일 쓰기
with open('output.txt', 'w') as output_file:
output_file.write("안녕하세요! 이것은 파이썬으로 작성한 첫 번째 줄입니다.\n")
output_file.write("두 번째 줄입니다.")
6. 오류 처리: try-except
블록
파일 입출력 작업 중에는 파일이 존재하지 않거나, 권한이 없어서 파일을 열 수 없는 등의 오류가 발생할 수 있습니다. 이러한 오류를 처리하기 위해 try-except
블록을 사용할 수 있습니다.
예제: 오류 처리
try:
with open('non_existent_file.txt', 'r') as file:
data = file.read()
except FileNotFoundError:
print("오류! 해당 파일이 존재하지 않습니다.")
다양한 예외 처리
파일 입출력 중 발생할 수 있는 다른 예외로는 PermissionError
, IOError
등이 있습니다. 이러한 예외도 적절히 처리해 주는 것이 좋습니다.
try:
with open('protected_file.txt', 'w') as file:
file.write("이 파일은 쓰기 금지되어 있습니다.")
except PermissionError:
print("오류! 파일에 쓰기 권한이 없습니다.")
7. 바이너리 파일 처리
텍스트 파일뿐만 아니라 바이너리 파일도 처리할 수 있습니다. 바이너리 파일은 이미지, 비디오, 실행 파일 등이 해당됩니다. 바이너리 모드('b'
)를 사용하여 이러한 파일을 처리할 수 있습니다.
예제: 바이너리 파일 읽기
# 이미지 파일을 바이너리 모드로 읽기
with open('image.png', 'rb') as file:
binary_data = file.read()
print(binary_data)
예제: 바이너리 파일 쓰기
# 바이너리 데이터를 파일에 쓰기
with open('output.bin', 'wb') as file:
file.write(b'\x48\x65\x6C\x6C\x6F') # "Hello"를 바이너리로 작성
8. 파일 입출력의 고급 기능
파일의 인코딩 지정
텍스트 파일을 읽거나 쓸 때 인코딩을 지정할 수 있습니다. 기본적으로는 시스템의 기본 인코딩이 사용되지만, encoding
매개변수를 통해 다른 인코딩을 지정할 수 있습니다.
# UTF-8 인코딩으로 파일 열기
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
파일의 버퍼링 제어
파일 입출력 시 버퍼링을 제어할 수 있습니다. buffering
매개변수를 사용하여 버퍼 크기를 지정하거나 버퍼링을 비활성화할 수 있습니다.
# 버퍼링 없이 파일 열기
with open('example.txt', 'r', buffering=0) as file:
content = file.read()
print(content)
9. 파일 입출력의 실제 활용 예제
로그 파일 작성
프로그램 실행 중 발생하는 이벤트를 로그 파일에 기록할 수 있습니다.
import datetime
# 로그 파일에 이벤트 기록
with open('app.log', 'a') as log_file:
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_file.write(f"[{timestamp}] 프로그램이 시작되었습니다.\n")
CSV 파일 처리
CSV 파일은 데이터를 저장하고 공유하는 데 자주 사용됩니다. 파이썬의 csv
모듈을 사용하면 CSV 파일을 쉽게 처리할 수 있습니다.
import csv
# CSV 파일 읽기
with open('data.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
print(row)
# CSV 파일 쓰기
with open('output.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['이름', '나이', '직업'])
writer.writerow(['홍길동', '30', '개발자'])
10. 파일 입출력의 성능 최적화
버퍼 크기 조정
파일 입출력 시 버퍼 크기를 조정하여 성능을 최적화할 수 있습니다. 큰 파일을 처리할 때는 버퍼 크기를 늘리는 것이 유리할 수 있습니다.
# 큰 버퍼 크기로 파일 열기
with open('large_file.txt', 'r', buffering=8192) as file:
content = file.read()
메모리 매핑 파일
매우 큰 파일을 처리할 때는 메모리 매핑 파일을 사용할 수 있습니다. mmap
모듈을 사용하면 파일을 메모리에 매핑하여 빠르게 접근할 수 있습니다.
import mmap
# 메모리 매핑 파일 사용
with open('large_file.txt', 'r+b') as file:
mmapped_file = mmap.mmap(file.fileno(), 0)
print(mmapped_file.read(100)) # 처음 100바이트 읽기
mmapped_file.close()
결론
파이썬의 파일 입출력은 매우 강력하고 유연한 기능입니다. 파일을 열고, 읽고, 쓰고, 닫는 기본적인 작업을 통해 다양한 데이터를 처리할 수 있습니다. 특히 with
문을 사용하면 파일을 안전하게 처리할 수 있으며, 오류 처리를 통해 더욱 견고한 프로그램을 작성할 수 있습니다.
'프로그래밍 > Python' 카테고리의 다른 글
객체 지향 프로그래밍(OOP)의 핵심 개념: 클래스, 상속, 다형성, 캡슐화, 추상화 (0) | 2025.02.20 |
---|---|
파이썬 예외 처리: 안정적인 코드를 위한 필수 가이드 (0) | 2025.02.20 |
파이썬 데이터 구조: 리스트, 튜플, 딕셔너리, 집합의 이해와 활용 (0) | 2025.02.20 |
파이썬 프로그래밍의 기초: 함수, 모듈, 패키지 이해하기 (0) | 2025.02.20 |
파이썬 제어문: 조건문과 반복문으로 프로그램 흐름 제어하기 (0) | 2025.02.20 |