HOWTO · Python
Python에서 배열로 CSV 읽기
이 가이드에서는 Python에서 CSV를 배열로 읽는 방법을 보여줍니다.
이 페이지의 내용
CSV 파일은 구분자로 나뉜 필드가 행으로 배열된 표 형식의 레코드를 저장합니다. Python에서 CSV 파일을 읽을 때는 데이터와 필요한 결과 구조에 맞춰 리더를 선택하세요. 숫자 배열에는 NumPy, 문자열 행에는 Python 표준 라이브러리의 csv 모듈, 레이블이 있는 표에는 pandas를 사용할 수 있습니다. 네 가지 예제 모두 통과한 실행 증거가 있으며, 각 예제는 자체 임시 CSV 파일을 만듭니다.
숫자형 CSV 데이터를 numpy.loadtxt()로 읽기
필드가 모두 숫자이고 표의 행과 열이 규칙적으로 구성되어 있다면 numpy.loadtxt()를 사용하세요. delimiter 인수는 입력 텍스트에서 값을 구분하는 문자를 지정합니다. 구분 문자가 반환된 배열에 포함되는 것은 아닙니다. 쉼표는 값 사이에서 구분자로 처리됩니다. 기본 delimiter는 공백이므로 쉼표로 구분된 데이터에는 쉼표를 지정하세요. 이 예제를 실행하려면 NumPy를 설치해야 합니다.
다음 예제를 실행하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
with TemporaryDirectory() as directory:
path = Path(directory) / "numbers.csv"
path.write_text("1,2,3\n4,5,6\n7,8,9\n", encoding="utf-8")
data_array = np.loadtxt(path, delimiter=",")
print(data_array)
여러 행과 열로 이루어진 이 입력에서 loadtxt()는 2차원 NumPy 배열을 반환합니다. 수치 연산에는 배열 연산을 활용하세요. 파일에 헤더가 있다면 숫자 리더가 헤더를 숫자로 읽으려 하지 않도록 해당 행을 건너뛰거나 별도로 처리하세요.
Python의 csv 모듈로 CSV 행 읽기
Python 표준 라이브러리의 csv.reader는 텍스트 필드나 서로 다른 유형의 값이 섞인 필드를 처리할 수 있습니다. 이 리더는 행마다 문자열 목록 하나를 반환합니다. 내장 함수 list()를 호출하면 리더의 항목을 모두 소비해 행 목록들을 다시 목록으로 만듭니다. list()는 메서드가 아니라 내장 함수이며, 결과는 NumPy 배열이 아닙니다. 각 필드를 직접 살펴보거나 변환하려는 경우에 유용합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import csv
with TemporaryDirectory() as directory:
path = Path(directory) / "people.csv"
path.write_text(
"Name,Age,Occupation\nJohn,28,Engineer\nJane,34,Doctor\n",
encoding="utf-8",
)
with path.open(newline="", encoding="utf-8") as file:
rows = list(csv.reader(file))
print(rows)
헤더는 첫 번째 행에 포함되며, 나이와 같은 값도 변환하기 전까지는 문자열입니다. 큰 파일에서는 파일 전체를 담은 목록을 만들지 말고 csv.reader를 한 번에 한 행씩 순회하세요. newline=""로 파일을 열면 CSV 모듈이 줄바꿈을 올바르게 처리합니다.
pandas로 CSV 데이터 읽기
열 레이블과 표 중심의 작업이 필요하다면 pandas를 선택하세요. 이 예제를 실행하기 전에 pandas를 설치해야 합니다. pandas.read_csv()는 기본적으로 첫 번째 행을 열 이름으로 사용해 레이블이 있는 DataFrame을 반환합니다. 후속 작업에서 배열이 필요하면 to_numpy()로 데이터를 배열로 변환할 수 있습니다. DataFrame 자체에는 행과 열 레이블이 유지됩니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as directory:
path = Path(directory) / "people.csv"
path.write_text(
"Name,Age,Occupation\nJohn,28,Engineer\nJane,34,Doctor\n",
encoding="utf-8",
)
frame = pd.read_csv(path)
data_array = frame.to_numpy()
print(data_array)
DataFrame에서는 열마다 서로 다른 유형으로 추론될 수 있습니다. NumPy 배열 하나에는 단일 dtype만 사용할 수 있으므로, 유형이 섞인 열을 변환하면 객체 배열이나 다른 공통 dtype의 배열이 만들어질 수 있습니다. 레이블이나 열별 작업이 중요하다면 DataFrame을 유지하고, 다음 단계에서 배열이 입력 형식으로 필요할 때만 변환하세요.
numpy.genfromtxt()로 누락된 숫자 값 처리하기
숫자 표에 빈 필드가 있다면 numpy.genfromtxt()를 사용하고 다음 계산에 알맞은 대체 값을 선택하세요. 여기서는 filling_values=np.nan으로 누락된 숫자 값을 NaN으로 표시합니다. 결과는 이 표시값을 담을 수 있도록 부동 소수점 값을 사용합니다. NumPy를 설치해야 합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
with TemporaryDirectory() as directory:
path = Path(directory) / "measurements.csv"
path.write_text("1,2,3\n4,,6\n7,8,\n", encoding="utf-8")
data_array = np.genfromtxt(
path, delimiter=",", filling_values=np.nan
)
print(data_array)
빈 필드는 NaN으로 표시됩니다. NumPy의 isnan 함수로 이를 감지하고 일반 숫자가 필요한 계산 전에 처리할 수 있습니다. genfromtxt()는 더 복잡한 입력 정리도 지원하지만, 파일에 필요한 옵션만 지정하면 파싱 동작을 명확하게 유지할 수 있습니다.
데이터에 맞는 CSV 리더 선택하기
- 결과로 NumPy 배열이 필요하고 필드가 규칙적인 숫자라면
numpy.loadtxt()를 사용하세요. - 문자열 행을 얻고 각 필드의 변환 방식을 직접 제어하려면
csv.reader를 사용하세요. Python에 포함되어 있습니다. - 레이블이 있는 표와 편리한 열 기반 처리가 필요하다면
pandas.read_csv()를 사용하세요. 배열은 필요한 경우에만 변환하면 됩니다. - 숫자형 구분 데이터에 누락된 필드가 있고 적절한 대체 값을 지정할 수 있다면
numpy.genfromtxt()를 사용하세요.
이 도구들은 모두 같은 종류의 객체를 반환하지 않습니다. 레이블, 문자열 필드, 숫자 배열 연산, 누락된 숫자의 명시적 처리 중 무엇이 필요한지 판단한 다음, 그 구조를 반환하는 리더를 선택하세요.