HOWTO · Python

Python에서 CSV 파일에 배열 쓰기

이 자습서는 Python에서 CSV 파일에 배열을 저장하는 방법을 보여줍니다.

이 페이지의 내용

CSV(쉼표로 구분된 값)는 표 형식의 데이터를 텍스트 행으로 저장하므로, 처리한 배열을 스프레드시트나 다른 프로그램과 공유할 때 유용합니다. 배열 형태의 데이터에는 NumPy를, 이미 DataFrame을 사용 중이라면 Pandas를, 일반적인 행 데이터와 안정적인 인용 처리가 필요하다면 Python의 csv 모듈을 선택하세요. 아래 예제에서는 쉼표를 구분자로 사용하고, 저장된 행을 읽는 방법도 보여줍니다.

numpy.savetxt()로 NumPy 배열을 CSV에 쓰기

numpy.savetxt()는 1차원 또는 2차원 배열을 텍스트 파일에 씁니다. 열을 쉼표로 구분하려면 delimiter=","를 전달하세요. 기본 구분자는 공백이므로, 그대로 두면 열이 쉼표로 구분되지 않습니다. 1차원 숫자 배열에는 정수 텍스트가 적합할 때 np.savetxt("numbers.csv", data, delimiter=",", fmt="%d")를 사용하세요. 소수 값은 "%.2f"와 같은 형식을 지정해 표시 정밀도를 조절할 수 있습니다.

문자와 숫자가 함께 있는 표 형식의 데이터라면 np.array([["Name", "Age"], ["Ada", 36]])처럼 2차원 배열을 만들고 fmt="%s"를 전달하세요. NumPy 배열은 요소의 자료형이 하나이므로 문자와 숫자를 함께 넣으면 문자열 값으로 처리되며, 이 형식은 해당 값을 텍스트로 씁니다. CSV 자체는 Python이나 NumPy의 자료형을 보존하지 않습니다. 파일을 읽는 프로그램에서 36 같은 값을 정수로 사용하려면 직접 해석해야 합니다.

NumPy는 배열의 각 행을 CSV의 한 행으로 씁니다. header를 지정하지 않으면 열 이름을 추가하지 않습니다. 헤더를 지정하면 기본적으로 앞에 주석 표시가 붙습니다. 열 이름을 첫 번째 행에 일반 텍스트로 넣으려면 header="Name,Age"와 comments=""를 지정하세요.

Pandas DataFrame.to_csv()로 배열을 CSV에 쓰기

열 이름을 붙이고 싶거나 이미 Pandas를 사용 중이라면 배열과 비슷한 데이터를 Pandas DataFrame으로 변환하세요. 예를 들어 df = pd.DataFrame(data, columns=["Name", "Age"])는 값에 열 이름을 지정하고, df.to_csv("people.csv", index=False)는 이를 파일에 씁니다. index=False 옵션을 사용하면 Pandas가 행 레이블을 첫 번째 열로 추가하지 않습니다. 행 레이블도 파일에 넣어야 할 때만 이 옵션을 생략하세요. 파일에 열 이름이 필요 없다면 header=False를 지정합니다. 다른 내보내기 옵션은 DataFrame.to_csv() 참고 문서에서 확인할 수 있습니다.

Python의 csv.writer()로 행을 CSV에 쓰기

Python 표준 라이브러리의 csv.writer()는 문자, 숫자, 쉼표 또는 따옴표가 포함된 행을 처리할 때 두루 쓰기 좋은 방법입니다. 파일을 newline=""로 열고 writer를 만든 다음 writerows()에 행을 전달하세요. 값에 쉼표나 따옴표가 있을 때 writer가 CSV 인용 처리를 맡습니다. 이 예제는 표준 라이브러리만 사용하며, 행과 구분자 처리를 확인할 수 있도록 저장된 파일 내용을 출력합니다.

이 예제를 실행하세요:

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

import csv
from pathlib import Path
from tempfile import TemporaryDirectory

rows = [[1, 4, 2], [7, 9, 4], [0, 6, 2]]
with TemporaryDirectory() as directory:
    path = Path(directory) / "numbers.csv"
    with path.open("w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerows(rows)
    print(path.read_text(encoding="utf-8"), end="")
1,4,2
7,9,4
0,6,2

입력 데이터가 많을 때 writerows()에는 행의 이터러블을 전달할 수 있으므로, 전체 데이터를 별도의 리스트로 만들 필요가 없습니다. with 블록이 끝나면 파일이 닫힙니다.

csv.reader()로 CSV 파일 다시 읽기

csv.reader()는 파일을 읽고 각 행을 문자열 목록으로 반환합니다. 읽기 객체이지 쓰기 객체가 아닙니다. 예를 들어 36으로 쓴 셀은 문자열 "36"로 읽힙니다. 숫자 연산에 사용해야 한다면 int() 또는 float()로 변환하세요. CSV를 읽을 때도 텍스트 파일을 newline=""로 여세요. 파일에 헤더가 있다면 데이터 행을 처리하기 전에 next(reader)를 호출하는 등 첫 번째 행을 따로 다루세요. 또한 reader는 인용된 구분자를 해석하므로, 각 줄을 쉼표로 나누는 방식과 다릅니다.

Python 파일 처리로 간단한 행 쓰기

쉼표, 따옴표 또는 줄 바꿈이 들어가지 않는 단순하고 통제된 값이라면 파일을 직접 다뤄도 괜찮습니다. 각 값을 텍스트로 변환하고, 쉼표로 행을 연결한 뒤 줄 바꿈을 덧붙이세요. 예를 들면 file.write(",".join(map(str, row)) + "\n")와 같습니다. 이 방법은 직접 텍스트 형식을 만드는 것으로, 범용 CSV 직렬화가 아닙니다. 예를 들어 "Doe, Jane"이라는 이름은 두 열로 나뉩니다. 임의의 데이터를 다룰 때는 인용과 구분자를 올바르게 처리하는 csv.writer()를 사용하세요. CSV 출력용 파일은 newline=""로 열고, ASCII가 아닌 문자를 포함할 파일이라면 UTF-8처럼 인코딩을 명시하세요.