HOWTO · Pandas

Pandas는 CSV에 추가

이 튜토리얼은 추가 모드에서 to_csv()를 사용하여 기존 CSV 파일에 데이터를 추가하는 방법을 보여줍니다.

이 페이지의 내용

Pandas의 to_csv()와 mode="a"를 사용하면 CSV 파일에 이미 들어 있는 행 뒤에 DataFrame의 행을 추가할 수 있습니다. 추가 모드는 기존 파일 내용을 보존합니다. 파일에 헤더가 이미 있다면 header=False로 설정하고, DataFrame 인덱스를 CSV의 별도 열로 추가하지 않으려면 index=False로 설정하세요.

기존 CSV 파일에 DataFrame 추가하기

이 예제는 먼저 CSV 파일을 만든 뒤 두 번째 DataFrame을 그 파일에 추가합니다. 실제 코드에서는 사용할 CSV 파일의 경로를 지정하세요. 추가하는 열은 기존 CSV의 열과 같은 순서여야 합니다. CSV 파일에는 열 이름을 기준으로 값을 자동으로 재배열하는 스키마가 저장되지 않습니다.

다음 예제를 실행하세요. 코드 블록은 정본과 바이트 단위로 동일하게 유지되므로, 코드에 포함된 열 이름과 예시 값은 영어로 표시됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path
from tempfile import TemporaryDirectory

import pandas as pd

with TemporaryDirectory() as directory:
    path = Path(directory) / "records.csv"
    original = pd.DataFrame({"name": ["Ava"], "score": [8]})
    added = pd.DataFrame({"name": ["Noah"], "score": [9]})

    original.to_csv(path, index=False)
    added.to_csv(path, mode="a", header=False, index=False)
    print(path.read_text(), end="")

첫 번째 쓰기 작업은 파일과 헤더를 만듭니다. 두 번째 작업은 mode="a"를 사용해 파일 끝에 행을 추가합니다. header=False를 지정하면 열 이름이 반복해서 기록되지 않고, index=False를 지정하면 Pandas가 행 인덱스를 추가하지 않습니다. 최종 파일에는 원래 행 뒤에 새 행이 들어갑니다. 예제의 열 이름 name, score와 값 Ava, Noah는 코드와 결과에서 영어로 표시됩니다. DataFrame 인덱스를 열로 포함하려면 index=False를 생략하고, CSV를 읽을 때 추가된 열도 고려하세요.

CSV 파일이 비어 있을 때만 헤더 쓰기

대상 파일이 비어 있거나 아직 없을 수 있다면 추가 모드로 파일을 열고 현재 파일 위치를 확인하세요. 없는 경로를 mode="a"로 열면 파일이 만들어집니다. tell() 호출은 현재 위치를 반환합니다. 추가 모드로 연 직후 위치가 0이면 파일이 비어 있다는 뜻입니다. 이 경우에만 헤더를 쓰세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path
from tempfile import TemporaryDirectory

import pandas as pd

with TemporaryDirectory() as directory:
    path = Path(directory) / "records.csv"
    rows = pd.DataFrame({"name": ["Mia"], "score": [7]})

    with path.open("a", encoding="utf-8", newline="") as csv_file:
        write_header = csv_file.tell() == 0
        rows.to_csv(csv_file, header=write_header, index=False)

이 방법은 새 파일과 기존 CSV 파일을 모두 처리합니다. 새로 만들었거나 비어 있는 파일에는 열 이름을 쓰고, 내용이 있는 파일에는 새 행만 추가합니다. 추가할 때마다 같은 열 순서와 호환되는 필드를 사용하세요. 여러 작성 작업이 같은 파일을 동시에 갱신할 수 있다면, 헤더 확인과 행 쓰기가 다른 작업과 뒤섞이지 않도록 쓰기 작업을 조정하세요.

추가된 행 확인 및 흔한 실수 피하기

파일 내용을 확인하려면 쓴 뒤 CSV를 읽어 보세요. 첫 번째 예제의 파일에는 헤더 하나와 원래 레코드 및 추가된 레코드가 들어갑니다. 예제를 실행하면 print(path.read_text(), end="") 문이 파일의 정확한 내용을 선택 가능한 텍스트로 표시합니다.

예제를 수정할 때는 다음 사항을 확인하세요.

  • 추가하는 DataFrame의 열은 CSV의 열과 같은 순서로 대응해야 합니다. Pandas는 값을 위치에 따라 씁니다. 추가할 때 CSV 열 이름을 기준으로 맞추지 않습니다.
  • 기존 헤더가 있는 파일에는 header=False를 사용하세요. 헤더가 반복되면 일반 데이터 행으로 읽힙니다.
  • 행 인덱스가 데이터에 포함되지 않는다면 index=False를 선택하세요. 그렇지 않으면 파일 구조에 인덱스 열을 포함하고 그 열도 고려해야 합니다.
  • 추가 모드는 파일 끝에 텍스트를 덧붙입니다. 서로 맞지 않는 열, 구분자 또는 인코딩을 검사하거나 수정하지 않습니다. 기존 CSV의 설정과 일치하도록 유지하세요.
  • 파일이 비어 있다면 첫 데이터 행을 쓰기 전에 헤더를 한 번 기록하세요. 위의 tell() 확인은 추가 모드로 연 파일의 위치를 사용해 이를 결정합니다.

Python에서 간단히 확인하려면 결과 파일을 pd.read_csv(path)로 불러와 행과 열 이름을 살펴보세요. 이렇게 하면 디스크에 쓴 텍스트뿐 아니라 파싱된 표도 확인할 수 있습니다.