跳到正文
效率工具实用笔记关于本站
表格与数据

用 Python 正确读写 CSV:表头、换行和编码

约 6 分钟阅读AI 辅助整理

面向初学者的 CSV 读写入门:用 csv.reader、DictReader、writer 处理自建 demo.csv,并说明 newline='' 与 encoding='utf-8' 的作用。

本文要点

  1. reader 会把每一行返回成一个字符串列表

  2. DictReader 会把每一行映射成字典

  3. 我们写到新文件 output.csv

用 Python 正确读写 CSV:表头、换行和编码的知识要点示意图
依据已审核正文摘取要点制作的示意图,非实物照片;请结合正文中的条件与范围阅读。要点摘自已审核正文;完整条件与说明见正文。查看高清图解 ↗
本文目录

CSV文件与编码准备

这篇笔记只处理最基础的 CSV 读写场景:一个自建的 demo.csv,内容为两行:

name,age
Alice,30

我们只用到 csv 模块里的 reader、DictReader、writer 三个基础用法,以及打开文件时的 newline='' 和 encoding='utf-8'。不涉及方言注册、Sniffer、QUOTE_NONNUMERIC 或其它高级参数。

开始前请先确认:demo.csv 是你自己新建的样例文件,不要拿重要数据直接做实验。如果文件里已有你需要的真实内容,先复制一份备份,再在副本上练习。下面的操作只针对这个自建示例文件,不会删除文件,也不会修改系统设置。

读写CSV的操作方法

1. 新建样例文件 demo.csv。

在练习目录里新建一个文本文件,命名为 demo.csv,写入两行内容:

name,age
Alice,30

第一行是表头,第二行是数据。保存时选择 UTF-8 编码。

2. 用 csv.reader 读取。

reader 会把每一行返回成一个字符串列表,不做自动类型转换。

import csv

with open('demo.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

这里 newline='' 是官方建议的打开方式:如果不写,引号字段里嵌入的换行可能无法被正确解释,在写入时某些平台还会多出一个 \r。encoding='utf-8' 则明确告诉 Python 按 UTF-8 解码,避免默认编码不一致带来的乱码。

3. 用 csv.DictReader 读取,按表头取字段。

DictReader 会把每一行映射成字典,键来自第一行表头。

import csv

with open('demo.csv', newline='', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['name'], row['age'])

因为 demo.csv 第一行是 name,age,所以可以直接用 row['name'] 和 row['age'] 取值。如果创建 DictReader 时传入了 fieldnames 参数,那么第一行也会被当作数据行处理;不传时,第一行用作字段名并从结果中省略。

4. 用 csv.writer 写入另一个新文件。

为了避免覆盖 demo.csv,我们写到新文件 output.csv。

import csv

rows = [
    ['name', 'age'],
    ['Alice', '30'],
]

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(rows)

writer 会把数据转换成带分隔符的字符串。写入时同样使用 newline='' 和 encoding='utf-8'。非字符串数据在写入前会用 str() 转换;None 会被写成空字符串。

5. 检查结果。

打开 output.csv,应能看到与 demo.csv 相同结构的两行内容。整个过程只新建和写入 output.csv,没有覆盖 demo.csv。

换行和表头问题

问:为什么打开文件要写 newline=''?

答:csv 模块自己处理换行。官方说明指出,如果不指定 newline='',引号字段内部的换行不会被正确解释,在写入时使用 \r\n 行尾的平台上还会多出一个 \r。指定它通常是安全的。

问:encoding='utf-8' 是不是必须的?

答:本示例文件按 UTF-8 保存,所以读取和写入都显式指定 encoding='utf-8'。实际文件的编码必须与指定值匹配;不要依赖未指定 encoding 时的默认行为。

问:reader 读出来的 age 是数字还是字符串?

答:是字符串。reader 不做自动类型转换,除非使用 QUOTE_NONNUMERIC 这类格式选项,而本文不展开这些高级参数。需要数字时请自己转换。

问:DictReader 和 reader 有什么区别?

答:reader 每行返回列表,DictReader 每行返回字典,键由表头决定,取值时更直观。

问:writer 会不会覆盖原文件?

答:会覆盖你指定的那个文件。所以本文把结果写到 output.csv,而不是 demo.csv。

操作限制与数据保护

1. 练习前先备份。如果 demo.csv 里有你不想丢失的内容,先复制一份再操作。

2. 只操作自建示例文件。不要对系统文件或重要数据文件执行写入、覆盖或删除操作。

3. 写入时使用 'w' 模式会清空目标文件原有内容。请确认目标文件名是新的,例如 output.csv。

4. 读写都建议同时写 newline='' 和 encoding='utf-8',这是官方示例中推荐的做法。

5. reader 返回的每个字段都是字符串,需要数值时自行转换。

6. 本文只覆盖 reader、DictReader、writer 的基础用法,不涉及方言注册、Sniffer、QUOTE_NONNUMERIC 等高级内容。

观看知识要点视频 18 秒

18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。

参考资料

以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。

请结合原始资料的适用条件阅读。

返回表格与数据 →