HOWTO · Python
在 Python 中将列表写入 CSV 列
本教程演示如何在 Python 中将列表写入 CSV 列。
本页内容
要将多个 Python 列表写成 CSV 列,可用 zip() 合并各列表中对应位置的值,再将生成的行传给 csv.writer。对于这类常见任务,Python 内置的 csv 模块就足够了。如果数据已经按行排列,可以直接使用嵌套列表;如果项目适合使用 pandas 或 NumPy 及其数据结构,也可以选择这些库。
使用 csv.writer 将并行列表写入 CSV 列
每个输入列表代表一列。zip() 会依次取出各列表中的第一个值、第二个值,以此类推。将生成的每个元组写成一行 CSV 后,同一位置的值就会并排放在一行中。打开 CSV 文件时使用 newline="",让 CSV 模块统一处理换行符。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
import csv
from pathlib import Path
from tempfile import TemporaryDirectory
names = ["Alice", "Bob", "Charlie"]
ages = [30, 25, 35]
cities = ["New York", "Los Angeles", "Chicago"]
with TemporaryDirectory() as directory:
path = Path(directory) / "people.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["Name", "Age", "City"])
writer.writerows(zip(names, ages, cities))
print(path.read_text(encoding="utf-8"), end="")
代码中的标签和输出均为英文。示例生成的可选文本输出如下:
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
文件包含一个表头,后面每个人对应一条记录:每行都有姓名、年龄和城市。临时目录让示例可以独立运行;如果希望脚本结束后保留文件,请将路径替换为所需的保存位置。
zip() 会在最短的输入列表耗尽时停止。如果列表长度不同,较长列表中剩余的值不会写入。如果必须保留所有值,请在写入前比较各列表的长度,并决定如何处理不匹配的情况,例如拒绝数据或填入缺失值。列表较多时,请为每个列表使用清晰的名称,并在同一次 zip() 调用中传入所有列表。
使用 csv.writer 将行写入 CSV 文件
如果数据已经按行排列,可以使用嵌套列表,其中每个内部列表代表一条记录。调用一次 writerows() 即可写入所有记录,也可以逐行调用 writerow()。例如,rows = [["Alice", 30], ["Bob", 25]] 会写入两条记录,每条记录包含两个字段。这与并行列表的形式不同:嵌套列表表示行,而 zip() 会将并行列转换为 CSV 文件中的行。
表头就是普通的第一行;如果读者需要列名,请显式添加。字段中包含逗号、引号或换行符时,CSV 写入器会按需为其加引号。它不会根据 Python 变量名推断表头。
使用 pandas 将列表写入 CSV 列
如果项目已经使用 pandas,可以用字典构造 DataFrame,字典的键作为列名、值作为列表,然后调用 to_csv(..., index=False)。参数 index=False 可避免 pandas 的行标签变成额外的 CSV 列。例如,相关操作是 pd.DataFrame({"Name": names, "Age": ages}) 和 df.to_csv("people.csv", index=False)。
这里展示的是用法示意,并非本文中实际执行的示例。pandas 是额外依赖;使用这种方法前,请先在项目中安装并管理它。传给 DataFrame 各列的列表长度需要兼容。
使用 NumPy 将数值数组写入 CSV
对于数值数组,NumPy 提供了 savetxt;设置 delimiter="," 即可写入逗号分隔的值。常见调用方式是 np.savetxt("measurements.csv", array, delimiter=",")。这种方法适用于数值数组,包括二维数组,其中数组的每一行会成为文件中的一行。对于混合文本与数值的列,它不是通用选择;此时请使用内置的 CSV 模块。
这里的 NumPy 调用是用法示意,并未在本文中执行。NumPy 是额外依赖;如果需要指定小数精度或数值的特定表示形式,可能还需要设置格式选项。
根据数据选择方法
需要轻量、依赖少的标准库方案时,使用内置的 csv 模块。用 zip() 合并并行列表,让对应值写入各列;如果数据已经按行排列,则传入嵌套列表。若数据已经存放在 DataFrame 中,并且需要 pandas 的索引和数据处理功能,可以选择 pandas。数值数组则可使用 NumPy 的 savetxt。无论选择哪种方法,都应判断 CSV 是否需要表头,并在写入前检查各列数据是否对齐。
常见问题
什么是 CSV 文件?
CSV 是逗号分隔值(comma-separated values)的缩写,是一种用于表格数据的文本格式。CSV 写入器会处理包含逗号、引号或换行符的字段,因此建议使用 CSV 库,而不是自行用逗号拼接值。
在 Python 中写入 CSV 需要安装库吗?
不需要。Python 内置了 csv 模块。对于需要相应数据结构或功能的项目,pandas 和 NumPy 是可选的第三方依赖。
可以将嵌套列表写入 CSV 文件吗?
可以。对行列表使用 writerows();每个内部列表提供一条 CSV 记录的字段。如果要将并行列表表示的列写入 CSV,请先用 zip() 合并它们。
如何在 Python 中读取 CSV 文件?
可以使用内置 csv 模块中的 csv.reader 或 csv.DictReader。如果项目使用 pandas,也可以用 pandas.read_csv() 将文件载入 DataFrame。
可以向现有 CSV 文件追加行吗?
可以。以追加模式("a")打开文件,并使用 newline="";创建 csv.writer 后,用 writerow() 或 writerows() 写入新记录。只有在文件尚无表头时才添加表头。