导读:本期聚焦于高永康创作的《Python怎么写入CSV文件?csv.writer处理逗号分隔数据的完整方法详解》,敬请观看详情。写入CSV文件时直接用字符串拼接,结果Excel打开全挤在一列,或者内容里的逗号把数据弄乱了,这是新手最常踩的坑。Python内置的csv模块提供了一个标准解决方案,其中csv.writer是写入逗号分隔数据的核心工具。本文详细讲解csv.writer的基本用法、writerow与writerows的区别、编码问题导致的中文乱码处理、 quoting参数如何正确转义含逗号或引号的字段,以及追加写入、字典写入和pandas方案的对比。看完你就能掌握用Python规范地写出各种复杂格式的CSV文件,不再为数据错位和乱码发愁。

处理表格数据时,CSV几乎是最通用的交换格式,Excel、数据库导出工具、各类数据分析平台都认它。很多初学者图省事,直接用open加字符串拼接的方式写CSV,比如f.write(",".join(row) + "\n"),一旦某个字段本身含有逗号、引号或者换行符,整行数据立刻错位,Excel打开后列全乱了。正确的做法是使用Python内置的csv模块,它遵循RFC 4180标准,会自动处理转义、引号包裹等细节,完全不需要手动拼接。

Python怎么写入CSV文件?csv.writer处理逗号分隔数据的完整方法详解

csv.writer基础用法:写入列表数据

csv模块的核心思路是:先用open打开一个文件对象,再把这个文件对象交给csv.writer,得到一个writer对象,之后调用它的writerow方法逐行写入。每一行数据用列表表示,writer会自动在字段之间插入逗号,并在文件末尾加上换行符。

import csv

# 表头数据
headers = ["姓名", "年龄", "城市"]
# 两行示例数据
rows = [
    ["张三", 28, "北京"],
    ["李四", 35, "上海"]
]

# newline="" 是关键,后面会解释原因
with open("people.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(headers)   # 写入表头
    writer.writerows(rows)     # 批量写入多行

这里有两个容易被忽略的细节。第一个是newline=""code>参数。Windows系统下,文本模式打开的文件会把换行符自动转换成回车加换行,而csv.writer自己也会追加换行,两者叠加就会在每行数据之间产生空行,Excel打开后每隔一行就是一个空白行,看起来非常难受。加上newline=""就禁用了系统的换行转换,输出的文件干净利落。

第二个细节是writerowwriterows的区别。writerow一次写一行,接收一个列表参数,适合逐条写入的场景,比如实时记录日志或边采集边写入。writerows一次接收一个可迭代对象,内部循环调用writerow,适合数据已经全部准备好、一次性批量落盘的场景,代码更简洁,也是批量写入的首选。

字段含逗号或引号怎么办:quoting参数与自动转义

CSV用逗号分隔字段,那字段内容本身有逗号怎么办?标准做法是用双引号把这个字段包裹起来,如果内容里还有双引号,就把引号翻倍。这些规则csv.writer全部自动处理,这也是它比手动拼接可靠的根本原因。

import csv

rows = [
    ["产品", "描述", "价格"],
    # 描述字段包含逗号和双引号
    ["手机", '5.5寸屏, 支持"快充"', 2999],
    ["笔记本", "14寸, 轻薄本", 4599]
]

with open("products.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL)
    writer.writerows(rows)

上面代码输出的文件中,含逗号的描述字段会被自动加上双引号,含双引号的地方会变成两个双引号。Excel和pandas读取时都能正确还原,数据不会错位。quoting参数有四个可选值,行为差异如下表所示:

取值行为说明适用场景
csv.QUOTE_MINIMAL默认值,仅在字段包含逗号、引号、换行符时才加引号包裹绝大多数场景,文件体积最小
csv.QUOTE_ALL所有字段都用双引号包裹某些严格要求全引号格式的导入工具
csv.QUOTE_NONNUMERIC非数字字段加引号,数字不加配合读取时的自动类型转换
csv.QUOTE_NONE不加引号,遇到特殊字符会报错,需配合escapechar指定转义符特殊定界格式,一般不用

另外提一下delimiter参数,它默认是逗号,如果你的目标格式其实是制表符分隔(TSV)或者分号分隔(某些欧洲地区Excel默认用分号),改成delimiter="\t"delimiter=";"即可,其他逻辑完全不变。这个参数和quoting可以同时使用。

中文乱码与字典写入:两个高频实战问题

写入中文后用Excel打开全是乱码,是中文环境下最常见的报障之一。根源在于Excel识别UTF-8文件时依赖BOM头,而普通的utf-8编码不带BOM。解决办法有两个:一是把编码改成utf-8-sig,Python会在文件开头写入BOM,Excel就能正确识别;二是如果只需要在Windows的Excel里看,可以用gbk编码,但文件传到Mac或Linux上就会出问题,通用性差,不推荐。

import csv

rows = [
    ["姓名", "部门"],
    ["张三", "研发部"],
    ["李四", "市场部"]
]

# utf-8-sig 会写入BOM头,Excel打开不乱码
with open("staff.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerows(rows)

当数据以字典形式存在时,用csv.DictWriter更顺手。它通过fieldnames指定列的顺序,写入时直接传字典,列名和数据的对应关系一目了然,不用担心列表顺序写错。写完表头记得调用writeheader,这是新手经常忘记的一步。

import csv

staff = [
    {"name": "张三", "dept": "研发部", "salary": 15000},
    {"name": "李四", "dept": "市场部", "salary": 12000}
]

with open("staff2.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "dept", "salary"])
    writer.writeheader()  # 写入表头,别漏掉
    writer.writerows(staff)

最后一个常见需求是追加写入,比如定时任务每次把新数据追加到已有文件末尾。只需把打开模式从"w"改成"a"即可。要注意的是追加模式不会帮你补表头,需要自己判断文件是否为空再决定是否写入表头。如果数据量大、还需要做筛选聚合等处理,也可以改用pandas的to_csv方法,一行代码搞定,代价是多装一个依赖。对于纯写入场景,标准库csv模块轻量、零依赖,依然是首选方案。

Python写入CSVcsv.writer逗号分隔数据修改时间:2026-09-09 03:36:34

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260909/53165.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。