Python으로 CSV 파일에 데이터를 한 줄씩 쓰는 방법을 철저하게 해설

Python은 데이터 처리에 매우 뛰어난 프로그래밍 언어로, CSV 파일의 조작도 그 일환입니다. CSV 파일은 데이터의 저장 및 공유에 널리 사용됩니다. 본 기사에서는 Python을 사용하여 CSV 파일에 데이터를 한 줄씩 효율적으로 쓰는 방법에 대해 구체적인 코드 예제 및 응용 예를 곁들여 자세히 설명합니다. 초보자부터 고급자까지 유용한 정보를 제공하니, 꼭 끝까지 읽어보세요.

Índice

Python으로 CSV 파일을 다루는 기본

CSV(Comma-Separated Values) 파일은 데이터를 표 형식으로 저장하기 위한 간단하고 효과적인 형식입니다. 각 행은 레코드를 나타내고, 각 열은 데이터 필드를 나타냅니다. Python에는 CSV 파일을 쉽게 조작할 수 있는 “csv” 모듈이 표준 라이브러리에 포함되어 있어 이를 이용하면 CSV 파일의 읽기 및 쓰기가 용이합니다.

CSV 파일의 구조

CSV 파일은 다음과 같이 쉼표로 구분된 텍스트 데이터로 구성됩니다:

이름, 나이, 직업  
타로, 30, 엔지니어  
하나코, 25, 디자이너

Python의 csv 모듈을 사용하기

Python의 “csv” 모듈을 임포트하면, CSV 파일의 읽기 및 쓰기가 간단하게 이루어집니다. 아래는 기본적인 임포트 방법입니다:

import csv

CSV 파일에 데이터를 쓰는 방법

Python을 사용해 CSV 파일에 데이터를 쓰기 위해서는 주로 “csv.writer” 클래스를 사용합니다. 이 클래스를 이용하면 CSV 파일에 데이터를 효율적으로 쓸 수 있습니다.

CSV 파일을 쓰는 기본 절차

먼저, CSV 파일을 쓰기 위한 기본적인 절차를 확인해 봅시다. 다음 단계에 따라 실행합니다:

  1. CSV 파일을 연다
  2. csv.writer 객체를 생성한다
  3. writerow 메서드를 사용해 데이터를 쓴다
  4. 파일을 닫는다

CSV 파일을 열기

CSV 파일을 열 때는 Python의 내장 함수 “open”을 사용합니다. 쓰기 모드로 열기 위해서는 “‘w'”를 지정합니다:

with open('example.csv', mode='w', newline='') as file:  
    writer = csv.writer(file)

csv.writer 객체를 생성하기

csv.writer 객체를 생성하면 CSV 파일에 데이터를 쓸 준비가 됩니다. 이 객체는 파일 객체를 인수로 하여 생성합니다.

    writer = csv.writer(file)

writerow 메서드를 사용해 데이터 쓰기

writerow 메서드를 사용하여 리스트 형식의 데이터를 한 줄씩 씁니다. 아래에 예를 보여드립니다:

    writer.writerow(['이름', '나이', '직업'])  
    writer.writerow(['타로', '30', '엔지니어'])  
    writer.writerow(['하나코', '25', '디자이너'])

파일 닫기

파일 작업이 끝나면 반드시 파일을 닫아야 합니다. with 구문을 사용하면, 자동으로 파일이 닫힙니다.

with open('example.csv', mode='w', newline='') as file:  
    writer = csv.writer(file)  
    writer.writerow(['이름', '나이', '직업'])  
    writer.writerow(['타로', '30', '엔지니어'])  
    writer.writerow(['하나코', '25', '디자이너'])


a5

CSV 파일의 쓰기 모드 종류

Python에서 CSV 파일에 데이터를 쓸 때는 쓰기 모드를 적절히 선택하는 것이 중요합니다. 쓰기 모드에는 주로 “추가 모드”와 “덮어쓰기 모드”가 있으며, 각각의 용도에 따라 구분해서 사용해야 합니다.

덮어쓰기 모드(‘w’)

덮어쓰기 모드는 기존 파일을 새로운 내용으로 덮어쓸 때 사용합니다. 이 모드로 파일을 열면, 기존 데이터는 모두 삭제되고, 새로운 데이터만 기록됩니다.

with open('example.csv', mode='w', newline='') as file:  
    writer = csv.writer(file)  
    writer.writerow(['이름', '나이', '직업'])  
    writer.writerow(['타로', '30', '엔지니어'])

추가 모드(‘a’)

추가 모드는 기존 파일에 데이터를 추가할 때 사용합니다. 이 모드로 파일을 열면, 기존 데이터는 그대로 남고, 새로운 데이터가 파일의 끝에 추가됩니다.

with open('example.csv', mode='a', newline='') as file:  
    writer = csv.writer(file)  
    writer.writerow(['하나코', '25', '디자이너'])

모드 선택의 포인트

  • 덮어쓰기 모드는 새로운 데이터 세트로 기존 파일을 완전히 대체할 때 사용합니다. 예를 들어, 매일 최신 데이터로 파일을 갱신할 때 적합합니다.
  • 추가 모드는 기존 데이터를 유지하면서 새로운 데이터를 추가할 때 사용합니다. 예를 들어, 로그 파일이나 지속적인 데이터 수집의 경우에 적합합니다.

전체 코드 예

아래에, 덮어쓰기 모드와 추가 모드의 사용 예를 보여드립니다:

import csv  

# 덮어쓰기 모드로 새로운 데이터를 기록  
with open('example.csv', mode='w', newline='') as file:  
    writer = csv.writer(file)  
    writer.writerow(['이름', '나이', '직업'])  
    writer.writerow(['타로', '30', '엔지니어'])  

# 추가 모드로 데이터를 추가  
with open('example.csv', mode='a', newline='') as file:  
    writer = csv.writer(file)  
    writer.writerow(['하나코', '25', '디자이너'])

이 코드를 실행하면, example.csv 파일에 새로운 데이터가 덮어쓰여지고, 그 후에 추가 데이터가 더해집니다.

실제 코드 예와 그 해설

여기에서는 Python으로 CSV 파일에 데이터를 쓰는 구체적인 코드 예를 보여주고, 그 동작을 상세히 해설합니다. 이를 통해 기본적인 사용법에서 응용까지의 이해를 높일 수 있습니다.

기본적인 쓰기 예

먼저, 기본적인 쓰기 예를 보겠습니다. 이 예에서는 간단한 데이터를 CSV 파일에 기록합니다.

import csv  

data = [  
    ['이름', '나이', '직업'],  
    ['타로', '30', '엔지니어'],  
    ['하나코', '25', '디자이너']  
]  

with open('example.csv', mode='w', newline='') as file:  
    writer = csv.writer(file)  
    for row in data:  
        writer.writerow(row)

이 코드는 다음과 같이 동작합니다:

  1. CSV 파일을 “w” 모드로 엽니다. 이로 인해 새로운 파일이 생성되고, 기존 파일이 있을 경우 덮어쓰여집니다.
  2. csv.writer 객체를 생성합니다.
  3. writerow 메서드를 사용해 리스트 형식의 데이터를 한 줄씩 파일에 씁니다.

사전 형식으로 쓰기 예

다음으로, 사전 형식의 데이터를 CSV 파일에 기록하는 예를 보여줍니다. 이를 통해 키를 헤더로 사용할 수 있습니다.

import csv  

data = [  
    {'이름': '타로', '나이': '30', '직업': '엔지니어'},  
    {'이름': '하나코', '나이': '25', '직업': '디자이너'}  
]  

with open('example_dict.csv', mode='w', newline='') as file:  
    fieldnames = ['이름', '나이', '직업']  
    writer = csv.DictWriter(file, fieldnames=fieldnames)  

    writer.writeheader()  
    for row in data:  
        writer.writerow(row)

이 코드의 포인트:

  1. DictWriter를 사용해 사전 형식의 데이터를 CSV 파일에 기록합니다.
  2. fieldnames를 지정하여 헤더를 정의합니다.
  3. writeheader 메서드를 사용해 헤더 행을 씁니다.
  4. writerow 메서드를 사용해 사전 형식의 데이터를 한 줄씩 파일에 씁니다.

데이터 추가 예

기존 CSV 파일에 데이터를 추가하는 예를 보여줍니다. 이 경우 모드를 “a”로 설정합니다.

import csv  

additional_data = [  
    ['지로', '28', '마케팅'],  
    ['사부로', '35', '프로젝트 매니저']  
]  

with open('example.csv', mode='a', newline='') as file:  
    writer = csv.writer(file)  
    for row in additional_data:  
        writer.writerow(row)

이 코드의 포인트:

  1. 파일을 “a” 모드로 열어 기존 데이터를 유지하면서 새로운 데이터를 추가합니다.
  2. 새로운 데이터를 한 줄씩 추가합니다.

이러한 예제를 통해 Python에서 CSV 파일 쓰기의 기본적인 방법부터 응용까지 배울 수 있습니다.

응용 예: 여러 데이터를 순차적으로 쓰기

실제 응용 프로그램에서는 대량의 데이터를 처리할 필요가 많으며, 데이터를 순차적으로 쓰는 것이 중요합니다. 여기에서는 Python을 사용하여 CSV 파일에 여러 데이터를 순차적으로 쓰는 응용 예를 소개합니다.

동적 데이터 쓰기

동적으로 생성되는 데이터를 CSV 파일에 쓰는 예를 보여줍니다. 이 방법은 데이터 수집이나 로그 저장 등에 유용합니다.

import csv  
import random  
import time  

# 더미 데이터를 생성하는 함수  
def generate_data():  
    names = ['타로', '하나코', '지로', '사부로']  
    ages = range(20, 40)  
    professions = ['엔지니어', '디자이너', '마케팅', '프로젝트 매니저']  

    return {  
        '이름': random.choice(names),  
        '나이': random.choice(ages),  
        '직업': random.choice(professions)  
    }  

# CSV 파일에 데이터를 쓰는 함수  
def write_data_to_csv(file_name, data):  
    with open(file_name, mode='a', newline='') as file:  
        fieldnames = ['이름', '나이', '직업']  
        writer = csv.DictWriter(file, fieldnames=fieldnames)  

        # 헤더가 없을 경우에만 쓰기  
        if file.tell() == 0:  
            writer.writeheader()  

        writer.writerow(data)  

# 데이터를 연속으로 생성하고 CSV 파일에 쓰기  
file_name = 'dynamic_data.csv'  
for _ in range(10):  # 여기서는 10회 데이터를 생성하여 기록  
    data = generate_data()  
    write_data_to_csv(file_name, data)  
    time.sleep(1)  # 1초 간격으로 데이터 생성

이 코드의 포인트:

  1. generate_data 함수에서 더미 데이터를 생성합니다.
  2. write_data_to_csv 함수에서 CSV 파일에 데이터를 씁니다. 헤더가 이미 기록되어 있는지 확인하고, 필요한 경우에만 헤더를 씁니다.
  3. 데이터를 연속으로 생성하고 1초 간격으로 CSV 파일에 기록합니다.

데이터 필터링과 쓰기

특정 조건에 따라 데이터를 필터링하고, 그 데이터만 CSV 파일에 쓰는 예를 보여줍니다.

import csv  

# 샘플 데이터  
data = [  
    {'이름': '타로', '나이': 30, '직업': '엔지니어'},  
    {'이름': '하나코', '나이': 25, '직업': '디자이너'},  
    {'이름': '지로', '나이': 28, '직업': '마케팅'},  
    {'이름': '사부로', '나이': 35, '직업': '프로젝트 매니저'}  
]  

# 필터링 함수  
def filter_data(data, age_threshold):  
    return [row for row in data if row['나이'] > age_threshold]  

# 필터링된 데이터를 쓰기  
filtered_data = filter_data(data, 30)  

with open('filtered_data.csv', mode='w', newline='') as file:  
    fieldnames = ['이름', '나이', '직업']  
    writer = csv.DictWriter(file, fieldnames=fieldnames)  

    writer.writeheader()  
    for row in filtered_data:  
        writer.writerow(row)

이 코드의 포인트:

  1. filter_data 함수에서 데이터를 필터링합니다. 이 예에서는 나이가 30세 이상인 데이터만 추출합니다.
  2. 필터링된 데이터를 CSV 파일에 씁니다.

이러한 응용 예를 통해, 보다 실용적인 데이터 쓰기 방법을 이해하고, Python을 활용한 데이터 처리 기술을 향상시킬 수 있습니다.

자주 발생하는 오류와 그 대처법

CSV 파일 쓰기 시 발생하는 오류에는 몇 가지 공통적인 것이 있습니다. 여기에서는 자주 발생하는 오류와 그 대처 방법에 대해 설명합니다.

PermissionError(접근 권한 오류)

이 오류는 파일이 열려 있거나 다른 프로세스에 의해 사용 중인 경우에 발생합니다.

import csv  

try:  
    with open('example.csv', mode='w', newline='') as file:  
        writer = csv.writer(file)  
        writer.writerow(['이름', '나이', '직업'])  
        writer.writerow(['타로', '30', '엔지니어'])  
except PermissionError:  
    print("파일에 접근할 수 없습니다. 다른 프로그램이 파일을 사용 중이지 않은지 확인하세요.")

대처법:

  • 파일이 다른 프로그램에서 열려 있지 않은지 확인합니다.
  • 파일의 권한을 확인합니다.

FileNotFoundError(파일을 찾을 수 없는 오류)

존재하지 않는 디렉토리에 파일을 쓰려고 할 때 발생합니다.

import csv  

try:  
    with open('nonexistent_directory/example.csv', mode='w', newline='') as file:  
        writer = csv.writer(file)  
        writer.writerow(['이름', '나이', '직업'])  
        writer.writerow(['타로', '30', '엔지니어'])  
except FileNotFoundError:  
    print("지정한 디렉토리가 존재하지 않습니다. 디렉토리를 확인하세요.")

대처법:

  • 파일 경로를 정확히 지정했는지 확인합니다.
  • 필요에 따라 디렉토리를 생성합니다.

csv.Error(CSV 모듈의 오류)

csv 모듈 사용 시 잘못된 데이터 형식이 원인이 되어 발생하는 오류입니다.

import csv  

try:  
    with open('example.csv', mode='w', newline='') as file:  
        writer = csv.writer(file)  
        writer.writerow(['이름', '나이', '직업'])  
        writer.writerow(['타로', '30', '엔지니어'])  
        writer.writerow(['하나코', '25', '디자이너'])  
except csv.Error as e:  
    print(f"CSV 파일 처리 중 오류가 발생했습니다: {e}")

대처법:

  • 데이터 형식이 올바른지 확인합니다.
  • 데이터에 특정 제어 문자나 잘못된 인코딩이 포함되지 않았는지 검사합니다.

UnicodeEncodeError(인코딩 오류)

특수 문자나 다른 인코딩의 데이터를 기록하려고 할 때 발생합니다.

import csv  

try:  
    with open('example.csv', mode='w', newline='', encoding='utf-8') as file:  
        writer = csv.writer(file)  
        writer.writerow(['이름', '나이', '직업'])  
        writer.writerow(['타로', '30', '엔지니어'])  
except UnicodeEncodeError as e:  
    print(f"인코딩 오류가 발생했습니다: {e}")

대처법:

  • 적절한 인코딩을 지정합니다(예: UTF-8).
  • 데이터에 포함된 특수 문자를 확인합니다.

전체 에러 핸들링 예

다음은 여러 오류를 한꺼번에 처리하기 위한 포괄적인 에러 핸들링 예제입니다:

import csv  

data = [  
    ['이름', '나이', '직업'],  
    ['타로', '30', '엔지니어'],  
    ['하나코', '25', '디자이너']  
]  

try:  
    with open('example.csv', mode='w', newline='', encoding='utf-8') as file:  
        writer = csv.writer(file)  
        for row in data:  
            writer.writerow(row)  
except PermissionError:  
    print("파일에 접근할 수 없습니다. 다른 프로그램이 파일을 사용 중이지 않은지 확인하세요.")  
except FileNotFoundError:  
    print("지정한 디렉토리가 존재하지 않습니다. 디렉토리를 확인하세요.")  
except csv.Error as e:  
    print(f"CSV 파일 처리 중 오류가 발생했습니다: {e}")  
except UnicodeEncodeError as e:  
    print(f"인코딩 오류가 발생했습니다: {e}")

이러한 대처법을 참고하여, 오류 발생 시 문제 해결을 수행하고, CSV 파일 쓰기 프로세스를 원활하게 진행하세요.

연습 문제: 직접 작성해 보세요

여기에서는 직접 Python 코드를 작성하여 CSV 파일에 데이터를 쓰는 연습 문제를 소개합니다. 이를 통해 배운 내용을 실천하며 이해를 높일 수 있습니다.

연습 문제 1: 기본적인 데이터 쓰기

다음 단계에 따라, 기본적인 CSV 파일 쓰기를 수행해 보세요.

  1. 다음 데이터를 CSV 파일에 기록하는 코드를 작성하세요.
  2. 파일명은 “students.csv”로 합니다.

데이터:

이름, 학년, 성적  
타나카, 1, A  
사토, 2, B  
스즈키, 3, A
import csv  

data = [  
    ['이름', '학년', '성적'],  
    ['타나카', '1', 'A'],  
    ['사토', '2', 'B'],  
    ['스즈키', '3', 'A']  
]  

with open('students.csv', mode='w', newline='') as file:  
    writer = csv.writer(file)  
    for row in data:  
        writer.writerow(row)

연습 문제 2: 사전 형식으로 데이터 쓰기

사전 형식의 데이터를 CSV 파일에 기록하는 연습을 해보세요.

  1. 다음 데이터를 사전 형식으로 “products.csv” 파일에 기록하세요.

데이터:

data = [  
    {'상품명': '노트', '가격': '100', '재고': '50'},  
    {'상품명': '펜', '가격': '50', '재고': '100'},  
    {'상품명': '지우개', '가격': '30', '재고': '200'}  
]
import csv  

data = [  
    {'상품명': '노트', '가격': '100', '재고': '50'},  
    {'상품명': '펜', '가격': '50', '재고': '100'},  
    {'상품명': '지우개', '가격': '30', '재고': '200'}  
]  

with open('products.csv', mode='w', newline='') as file:  
    fieldnames = ['상품명', '가격', '재고']  
    writer = csv.DictWriter(file, fieldnames=fieldnames)  

    writer.writeheader()  
    for row in data:  
        writer.writerow(row)

연습 문제 3: 동적 데이터 추가

동적으로 생성된 데이터를 기존 CSV 파일에 추가해 보세요.

  1. 다음 코드를 사용하여, 10명분의 랜덤 사용자 데이터를 “users.csv”에 추가하세요.

데이터 생성 코드:

import csv  
import random  

names = ['야마다', '이토', '타카하시', '고바야시', '사이토']  
ages = range(20, 50)  

def generate_user_data():  
    return {'이름': random.choice(names), '나이': random.choice(ages)}  

with open('users.csv', mode='a', newline='', encoding='utf-8') as file:  
    fieldnames = ['이름', '나이']  
    writer = csv.DictWriter(file, fieldnames=fieldnames)  

    # 헤더가 없을 경우에만 쓰기  
    if file.tell() == 0:  
        writer.writeheader()  

    for _ in range(10):  
        writer.writerow(generate_user_data())

이러한 연습을 통해, Python으로 CSV 파일에 데이터를 쓰는 기술을 실습해 보세요.

정리

Python으로 CSV 파일에 한 줄씩 데이터를 쓰는 방법에 대해, 기본적인 조작부터 응용 예, 자주 발생하는 오류와 그 대처법까지 자세히 설명했습니다. 아래에 주요 포인트를 정리합니다.

기본적인 조작

  • Python의 표준 라이브러리 “csv” 모듈을 사용하면 CSV 파일의 읽기 및 쓰기가 용이합니다.
  • csv.writer 객체를 사용해 데이터를 기록하고, csv.DictWriter 객체를 사용해 사전 형식의 데이터를 기록할 수 있습니다.

쓰기 모드 선택

  • 덮어쓰기 모드(‘w’)와 추가 모드(‘a’)를 적절히 구분하여 사용하는 것이 중요합니다.
  • 덮어쓰기 모드는 기존 데이터를 대체할 때 사용하고, 추가 모드는 기존 데이터에 새로운 데이터를 더할 때 사용합니다.

에러 핸들링

  • CSV 파일 쓰기 시 PermissionError, FileNotFoundError, csv.Error, UnicodeEncodeError 등의 오류가 발생할 수 있습니다.
  • 적절한 에러 핸들링을 수행하여 프로그램이 오류에 대해 견고한지 확인하는 것이 중요합니다.

실천과 응용

  • 동적으로 생성되는 데이터나 대량의 데이터를 효율적으로 CSV 파일에 기록하는 방법을 배웠습니다.
  • 사전 형식의 데이터나 조건부 데이터 필터링을 수행하여, 보다 고급스러운 데이터 처리를 실천했습니다.

이러한 지식을 활용하여, 실제 데이터 처리나 파일 조작에 도움이 되기를 바랍니다. Python으로 CSV 파일을 조작하는 기술은 많은 데이터 처리 작업에서 매우 유용한 스킬이 될 것입니다.

Índice