프로그래밍/Python

파이썬 파일 입출력: 파일 열기, 읽기, 쓰기, 닫기의 모든 것

shimdh 2025. 2. 20. 10:01
728x90

파이썬에서 파일 입출력은 프로그램이 외부 데이터와 상호작용하는 중요한 방법 중 하나입니다. 파일을 열고, 데이터를 읽거나 쓰고, 마지막으로 파일을 닫는 과정을 통해 다양한 작업을 수행할 수 있습니다. 이번 포스트에서는 파이썬의 파일 입출력에 대해 자세히 알아보고, 예제를 통해 실제로 어떻게 사용하는지 살펴보겠습니다. 파일 입출력의 기본 개념부터 고급 기능까지 모두 다루어 보겠습니다.


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 문을 사용하면 파일을 안전하게 처리할 수 있으며, 오류 처리를 통해 더욱 견고한 프로그램을 작성할 수 있습니다.

728x90