HOWTO · Python

在 Python 中读取 CSV 到数组

本教程演示了如何在 Python 中将 CSV 读入数组。

本页内容

CSV 文件将表格记录存储为由分隔符划分的字段行。在 Python 中读取 CSV 时,应根据数据内容和所需的数据结构选择读取方式:需要数值数组时使用 NumPy,需要字符串行时使用 Python 标准库的 csv 模块,需要带标签的表格时使用 pandas。四个示例均有通过的运行时证据,并且每个示例都会创建自己的临时 CSV 文件。

使用 numpy.loadtxt() 读取数值型 CSV 数据

当字段均为数值且排列成规则表格时,可使用 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() 会返回二维 NumPy 数组。数值计算时可以使用数组运算。如果文件包含表头,请显式跳过或处理该行,不要让数值读取器尝试将它解析为数字。

使用 Python 的 csv 模块读取 CSV 行

标准库中的 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)

Pandas 可能会为 DataFrame 的不同列推断出不同类型。单个 NumPy 数组只能有一种 dtype,因此将混合类型的列转换为数组时,结果可能是 object 数组或其他统一类型。如果需要标签和逐列操作,请保留 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()。

这些工具返回的数据对象并不相同。先确定你需要标签、字符串字段、数值数组运算,还是对缺失数值进行显式处理,再选择能生成所需结构的读取器。