프로그래밍/Python

파이썬 파일 입출력: 파일 열기, 닫기, 읽기, 쓰기, 그리고 CSV 파일 처리

shimdh 2025. 2. 21. 09:50
728x90

파이썬에서 파일 입출력은 프로그램이 외부 저장소와 데이터를 주고받는 중요한 과정입니다. 이번 포스트에서는 파일을 열고 닫는 기본적인 방법부터 파일 읽기, 쓰기, 그리고 CSV 파일 처리까지 다루어 보겠습니다. 각 단계별로 예제 코드를 통해 설명하겠습니다. 파일 입출력은 데이터의 영속성을 유지하고, 프로그램 간에 정보를 공유하는 데 매우 중요하므로, 이 내용을 잘 이해하면 다양한 프로젝트에서 유용하게 활용할 수 있습니다.


1. 파일 열기와 닫기

파일을 사용하기 위해서는 먼저 해당 파일을 열어야 합니다. 파이썬에서는 open() 함수를 사용하여 파일을 엽니다. 파일을 열 때는 모드를 지정해야 하며, 가장 일반적인 모드는 다음과 같습니다:

  • 'r': 읽기 모드 (기본값)
  • 'w': 쓰기 모드 (기존 내용을 지우고 새로 작성)
  • 'a': 추가 모드 (기존 내용 뒤에 새 내용 추가)
  • 'b': 바이너리 모드 (바이너리 데이터 처리)
  • 'x': 배타적 생성 모드 (파일이 이미 존재하면 오류 발생)
  • 'r+': 읽기와 쓰기 모드 (파일을 읽고 쓸 수 있음)
  • 'w+': 쓰기와 읽기 모드 (파일을 새로 생성하거나 덮어쓰기)
  • 'a+': 추가와 읽기 모드 (파일 끝에 데이터를 추가하고 읽기)

파일 작업이 끝난 후에는 반드시 close() 메서드를 호출하여 파일을 닫아야 합니다. 이는 시스템 자원을 해제하고 데이터 손실을 방지하기 위해 중요합니다.

1.1 파일 열기와 닫기 예제

# 텍스트 파일 열기 (읽기 모드)
file = open('example.txt', 'r')

# 파일 작업 수행
content = file.read()
print(content)

# 파일 닫기
file.close()

1.2 with 문을 사용한 파일 자동 관리

with 문을 사용하면 파일을 더 안전하게 관리할 수 있습니다. with 블록이 종료되면 파일이 자동으로 닫히므로, 파일을 닫는 것을 잊어버리는 실수를 방지할 수 있습니다.

with open('example.txt', 'r') as file:
    content = file.read()  # 파일 내용 읽기
    print(content)

# 여기서 file은 자동으로 닫힙니다.

1.3 파일 열기 모드의 활용

파일을 열 때 다양한 모드를 활용하면 더 유연하게 작업할 수 있습니다. 예를 들어, 바이너리 모드('b')는 이미지나 음성 파일과 같은 비텍스트 데이터를 처리할 때 사용됩니다.

# 바이너리 모드로 파일 열기
with open('image.png', 'rb') as file:
    binary_data = file.read()
    print(binary_data[:10])  # 파일의 처음 10바이트 출력

2. 파일 읽기와 쓰기

파일을 열고 나면, 파일에 데이터를 쓰거나 파일에서 데이터를 읽을 수 있습니다. 파일 읽기와 쓰기는 데이터의 영속성을 유지하고, 프로그램 간에 정보를 공유하는 데 필수적입니다.

2.1 파일 쓰기

파일에 데이터를 쓸 때는 write() 또는 writelines() 메서드를 사용합니다. write()는 단일 문자열을 쓰는 데 사용되며, writelines()는 문자열 리스트를 파일에 씁니다.

# 텍스트 파일 생성 및 내용 작성
with open('output.txt', 'w') as file:
    file.write('안녕하세요!\n')  # 단일 문자열 쓰기
    file.writelines(['첫 번째 줄\n', '두 번째 줄\n'])  # 여러 줄 쓰기

2.2 파일 읽기

파일에서 데이터를 읽을 때는 read(), readline(), readlines() 메서드를 사용할 수 있습니다. 각 메서드는 다음과 같은 특징을 가집니다:

  • read(): 전체 파일 내용을 한 번에 읽음
  • readline(): 파일에서 한 줄씩 읽음
  • readlines(): 파일의 모든 줄을 리스트로 반환
# 텍스트 파일에서 내용 읽어오기
with open('output.txt', 'r') as file:
    content = file.read()  # 전체 내용 읽기
    print(content)

# 한 줄씩 읽기
with open('output.txt', 'r') as file:
    line = file.readline()
    while line:
        print(line.strip())  # 줄바꿈 문자 제거 후 출력
        line = file.readline()

# 모든 줄을 리스트로 읽기
with open('output.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

3. CSV 파일 처리

CSV(Comma-Separated Values) 파일은 데이터를 표 형식으로 저장하는 데 널리 사용됩니다. 파이썬에서는 csv 모듈을 사용하여 CSV 파일을 쉽게 처리할 수 있습니다. CSV 파일은 데이터 분석, 데이터베이스 관리, 그리고 다양한 애플리케이션에서 데이터를 교환하는 데 유용합니다.

3.1 CSV 파일 읽기

csv.reader()를 사용하여 CSV 파일을 읽을 수 있습니다. 이 함수는 파일의 각 줄을 리스트로 반환합니다.

import csv

# CSV 파일 열기 및 내용 읽기
with open('data.csv', mode='r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)  # 각 행을 리스트 형태로 출력

3.2 CSV 파일 쓰기

csv.writer()를 사용하여 CSV 파일에 데이터를 쓸 수 있습니다. writerow()는 단일 행을 쓰는 데 사용되며, writerows()는 여러 행을 한 번에 씁니다.

import csv

# 새 CSV 파일 생성 및 데이터 쓰기
data = [
    ["이름", "나이", "직업"],
    ["홍길동", "30", "개발자"],
    ["김철수", "25", "디자이너"]
]

with open('output.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(data)  # 여러 행을 한 번에 쓰기

3.3 딕셔너리를 이용한 CSV 파일 처리

딕셔너리를 사용하면 더 직관적으로 CSV 파일을 처리할 수 있습니다. csv.DictReader()csv.DictWriter()를 사용하면 헤더를 키로 사용하여 데이터를 읽고 쓸 수 있습니다.

import csv

# 딕셔너리로부터 CSV 파일 작성하기
data_dict = [
    {"name": "홍길동", "age": 30, "job": "개발자"},
    {"name": "김철수", "age": 25, "job": "디자이너"}
]

with open('output_dict.csv', mode='w', newline='', encoding='utf-8') as file:
    fieldnames = ["name", "age", "job"]
    writer = csv.DictWriter(file, fieldnames=fieldnames)

    writer.writeheader()  # 헤더 작성
    writer.writerows(data_dict)  # 행 작성

3.4 특정 구분자로 CSV 파일 처리하기

CSV 파일은 기본적으로 쉼표를 구분자로 사용하지만, 다른 문자를 구분자로 사용할 수도 있습니다. 예를 들어, 세미콜론(;)이나 탭(\t)을 구분자로 사용할 수 있습니다.

import csv

# 세미콜론으로 구분된 값 처리하기
with open('semicolon_data.csv', mode='r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter=';')

    for row in reader:
        print(row)

4. 파일 입출력의 고급 기능

파일 입출력은 단순히 텍스트나 CSV 파일을 다루는 것 이상으로 확장될 수 있습니다. 예를 들어, JSON 파일을 처리하거나, 대용량 파일을 효율적으로 읽고 쓰는 방법 등이 있습니다.

4.1 JSON 파일 처리

JSON(JavaScript Object Notation)은 데이터를 교환하는 데 널리 사용되는 형식입니다. 파이썬에서는 json 모듈을 사용하여 JSON 파일을 쉽게 처리할 수 있습니다.

import json

# JSON 파일 쓰기
data = {
    "name": "홍길동",
    "age": 30,
    "job": "개발자"
}

with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

# JSON 파일 읽기
with open('data.json', 'r', encoding='utf-8') as file:
    loaded_data = json.load(file)
    print(loaded_data)

4.2 대용량 파일 처리

대용량 파일을 처리할 때는 한 번에 모든 데이터를 메모리에 로드하지 않고, 조금씩 읽어서 처리하는 것이 효율적입니다.

# 대용량 파일을 조금씩 읽기
with open('large_file.txt', 'r', encoding='utf-8') as file:
    while True:
        chunk = file.read(1024)  # 1024바이트씩 읽기
        if not chunk:
            break
        print(chunk)

5. 파일 입출력의 실용적인 예제

파일 입출력을 활용하여 실용적인 예제를 살펴보겠습니다. 예를 들어, 로그 파일을 분석하거나, 사용자 입력을 파일에 저장하는 프로그램을 작성할 수 있습니다.

5.1 로그 파일 분석

로그 파일은 시스템이나 애플리케이션의 동작을 기록하는 데 사용됩니다. 로그 파일을 분석하여 특정 패턴이나 오류를 찾는 작업은 파일 입출력을 통해 쉽게 구현할 수 있습니다.

# 로그 파일에서 특정 키워드 찾기
keyword = "ERROR"

with open('app.log', 'r', encoding='utf-8') as file:
    for line in file:
        if keyword in line:
            print(line.strip())

5.2 사용자 입력을 파일에 저장

사용자로부터 입력을 받아 파일에 저장하는 프로그램을 작성할 수 있습니다. 이는 데이터 수집이나 설정 파일 생성에 유용합니다.

# 사용자 입력을 파일에 저장
user_data = []

while True:
    data = input("데이터를 입력하세요 (종료하려면 'q'를 입력): ")
    if data.lower() == 'q':
        break
    user_data.append(data)

with open('user_input.txt', 'w', encoding='utf-8') as file:
    file.writelines([f"{line}\n" for line in user_data])

6. 파일 입출력의 주의사항

파일 입출력을 사용할 때는 몇 가지 주의사항을 고려해야 합니다. 이러한 주의사항을 지키면 데이터 손실이나 시스템 자원 누수를 방지할 수 있습니다.

6.1 파일 닫기의 중요성

파일을 열고 작업을 마친 후에는 반드시 파일을 닫아야 합니다. 파일을 닫지 않으면 시스템 자원이 해제되지 않아 메모리 누수가 발생할 수 있습니다.

# 파일을 닫지 않았을 때의 문제
file = open('example.txt', 'r')
content = file.read()
# 파일을 닫지 않음

6.2 예외 처리

파일 입출력 중에 발생할 수 있는 예외를 처리하는 것이 중요합니다. 예를 들어, 파일이 존재하지 않거나, 권한이 없는 경우에 대한 예외 처리를 해야 합니다.

# 예외 처리 예제
try:
    with open('nonexistent_file.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
except PermissionError:
    print("파일 접근 권한이 없습니다.")

결론

파이썬에서 파일 입출력은 매우 직관적이고 강력한 기능을 제공합니다. 파일을 열고 닫는 기본적인 작업부터 파일 읽기, 쓰기, 그리고 CSV 파일 처리까지 다양한 방법을 통해 데이터를 효과적으로 관리할 수 있습니다. 이러한 기술들은 프로그래밍 프로젝트에서 필수적이며, 데이터 처리 및 분석 작업에서 큰 도움이 될 것입니다.

728x90