news 2026/4/25 15:40:18

python csv

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python csv

# 聊聊Python里的CSV模块

有过两年Python开发经验的人,大概率都用过CSV文件。这东西看起来简单,但用起来有不少门道。

它到底是个什么东西

CSV全称是Comma-Separated Values,逗号分隔值。就是把表格数据用纯文本存起来。每一行是一行数据,每个字段用逗号隔开。比如:

姓名,年龄,城市 张三,28,北京 李四,32,上海

以前我在一家电商公司干活,后端服务之间传数据,用的就是CSV。当时觉得这玩意儿low,后来才明白,csv在很多场景下确实是最合适的选择——简单、通用、任何编辑器都能打开。

有一点值得提,很多人以为CSV就真的只靠逗号分隔。实际上,Python的csv模块考虑了更复杂的情况,比如字段里包含逗号该怎么办,字段本身有换行符怎么办。标准做法是用引号把字段包起来,或者用双引号转义。

它能解决什么问题

CSV最大的用处是在不同系统之间传递表格数据。

举个实际例子,之前我们团队需要把数据库里两千多万条用户数据导出给数据部门做分析。用Excel?文件太大了打不开。用数据库直连?网络安全策略不允许。最后方案就是导出成CSV,十几GB的文本文件,用gzip压缩一下扔给数据部门。

另一个常见场景是数据迁移。从旧系统导出CSV,脚本处理一下,再导入新系统。这种事我干过不下二十次,每次都能发现CSV的一些小坑。

还有一个容易被忽视的点,CSV可以用来做配置。有些项目把配置写成CSV而不是JSON或YAML,方便产品经理或运营人员直接编辑。

怎么用起来

Python自带csv模块,不用额外安装。用法很简单,但有几个地方新手容易踩坑。

读取CSV文件的基本写法:

importcsvwithopen('data.csv','r',encoding='utf-8')asf:reader=csv.reader(f)forrowinreader:print(row)

这段代码会把每一行数据变成一个列表。csv.reader返回的是一个迭代器,不会一次性把整个文件读进内存,这点在处理大文件时很关键。

写入稍微有点区别:

withopen('output.csv','w',newline='',encoding='utf-8-sig')asf:writer=csv.writer(f)writer.writerow(['姓名','年龄','城市'])writer.writerow(['张三',28,'北京'])

注意newline=''这个参数。不加的话,Windows系统下会多出空行,因为csv模块自己处理换行,和文件系统的换行控制冲突了。

还有编码问题。UTF-8可以跨平台,但如果要在Excel里打开,用utf-8-sig编码更好——带BOM的UTF-8,Excel才能正确识别。

字典形式的读写也很实用:

withopen('data.csv','r')asf:reader=csv.DictReader(f)forrowinreader:print(row['姓名'],row['年龄'])withopen('output.csv','w',newline='')asf:fieldnames=['姓名','年龄','城市']writer=csv.DictWriter(f,fieldnames=fieldnames)writer.writeheader()writer.writerow({'姓名':'张三','年龄':28,'城市':'北京'})

一些实际经验

处理大文件时,用csv.reader而不是手动按行读取加split(',')。这不仅仅是习惯问题,csv.reader能正确处理带引号的字段,自己写split处理不了"张三,李四"这样的字段——逗号在引号内,不应该被当成分隔符。

分隔符问题经常遇到。有些人用tab分隔,有些系统用分号。可以指定delimiter参数:

reader=csv.reader(f,delimiter='\t')

有一种情况坑了我很久——空行中的空字段。CSV规范里,一行数据末尾的空字段可以省略,也可以留空。不同的CSV生成器的处理方式不一样。对于关键字段,读进来后最好检查一下是不是None或空字符串。

另一个问题:日期格式。不同系统输出的日期格式差别很大,"2024-01-15"和"01/15/2024"并存的情况很常见。统一转换成标准格式再处理是个好习惯。

处理坏数据也很重要。一个文件里可能有十万行是好的,就一行有问题。用try...except捕获异常,把问题行记录下来然后跳过,比程序直接崩溃要实用得多。之前处理一次对账数据,就因为一行有奇怪的编码字符,程序跑了五个小时突然挂了,整个人都不好了。

和其他格式的比较

CSV、JSON、Excel、Parquet这些格式各有适用场景。

CSV vs JSON:CSV更节省空间,尤其数据量大时。JSON的好处是能表示嵌套结构,CSV只能存平面表格。如果你的数据有复杂的层级关系,比如用户信息和订单列表,用JSON更合适。如果就是一张简简单单的表格,CSV更轻量。

CSV vs Excel文件:主要区别是CSV只有数据,不保存格式、公式、多sheet这些信息。有些同事喜欢用Excel保存数据,然后发现文件打不开了——Excel的二进制格式容易损坏。CSV是纯文本,几乎不可能损坏。但Excel能存多张表、能设置单元格颜色、能写公式,这些CSV做不到。如果需要这些功能,可以考虑用openpyxl库处理Excel文件。

CSV vs Parquet:Parquet是列式存储格式,压缩率高,读取速度快,尤其适合做数据分析。体积能比CSV小好几倍,读取部分数据时不需要读整个文件。但Parquet的兼容性不如CSV,很多工具不支持直接打开。日常开发中,小规模数据直接用CSV,大数据量分析场景才考虑Parquet。

CSV vs SQLite:这个对比有点意思。SQLite是一个完整的数据库引擎,支持SQL查询、索引、事务。CSV只是一个简单的数据格式。但如果数据量不大,又需要做查询,用SQLite比CSV更方便。反过来,如果只是简单的数据交换,SQLite又显得重了。看场景说话。

实际项目里,我也见过混用的方案。先用CSV把数据快速导出来,用Python脚本清洗转换,最后导入数据库中。这样既利用了CSV的简单通用,又借助Python的能力做复杂处理。一个工具解决不了所有问题,组合才是常态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 15:39:51

别再复制粘贴了!这9条ChatGPT润色指令,让你的论文写作效率翻倍

9条ChatGPT高阶润色指令:从初稿到定稿的智能写作工作流 凌晨三点的实验室里,咖啡杯已经见底,屏幕上的论文初稿却依然显得生涩冗长——这是许多研究者都经历过的困境。传统论文润色往往需要反复推敲语句、检查语法、调整结构,耗费大…

作者头像 李华
网站建设 2026/4/25 15:38:25

WebSite-Downloader:一键将网站完整保存到本地的Python神器

WebSite-Downloader:一键将网站完整保存到本地的Python神器 【免费下载链接】WebSite-Downloader 项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader 你是否曾担心重要的网站内容突然消失?是否需要在无网络环境下访问在线文档&a…

作者头像 李华
网站建设 2026/4/25 15:37:06

保姆级教程:用Canvas和Web Audio API给个人音乐播放器加个酷炫波形图

从零打造音乐播放器波形图:Canvas与Web Audio的实战指南 音乐播放器的视觉体验往往被忽视,但一个动态响应的波形图能让你的作品瞬间脱颖而出。想象一下,当用户点击播放按钮,随着旋律起伏的不仅是音符,还有屏幕上跳动的…

作者头像 李华
网站建设 2026/4/25 15:36:18

RocketMQ-Flink终极指南:构建企业级实时流处理管道的完整教程

RocketMQ-Flink终极指南:构建企业级实时流处理管道的完整教程 【免费下载链接】rocketmq-flink RocketMQ integration for Apache Flink. This module includes the RocketMQ source and sink that allows a flink job to either write messages into a topic or re…

作者头像 李华