当前位置: 首页 > news >正文

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的能力做复杂处理。一个工具解决不了所有问题,组合才是常态。

http://www.jsqmd.com/news/698671/

相关文章:

  • ESP-IDF离线安装包+Python虚拟环境:打造Windows上最稳定的ESP32开发环境(避坑网络问题)
  • 如何通过Perseus开源补丁解锁《碧蓝航线》全皮肤功能:技术原理与实战指南
  • 告别龟速下载!RedHat 9/CentOS Stream 9 一键切换阿里云、清华等国内Yum源(2024最新)
  • C++26合约迁移紧急预案:Legacy代码零修改接入方案,已验证于千万行金融交易系统(附ASAN+Contract双监控POC)
  • 滴哦小精灵:轻松搞定桌面备忘与快捷启动
  • 布隆过滤器(BloomFilter)
  • ROS导航包老是定位飘?可能是你的tf树没搞对(诊断与修复指南)
  • 避坑指南:在Qt和VS2022中正确引用Halcon C++库,解决‘未定义标识符’和链接错误
  • python sqlite3
  • 2026年专业的食品饮料动态膜再生系统有哪些 - 品牌排行榜
  • 5个核心技巧:用Pixel-Composer节点式编辑打造专业像素艺术特效
  • BilibiliDown:3步解决B站视频下载难题的高效方案
  • 京东e卡回收前的重点!线上线下哪里靠谱? - 圆圆收
  • AlphaPlayer架构深度解析:跨平台透明视频动画引擎的设计哲学与实践
  • Excel文件打不开别慌!手把手教你用Stellar Repair for Excel 6.0.X救回数据(附详细操作步骤)
  • 嵌入式C结构体对齐×大模型权重布局(内存带宽利用率提升3.8倍的底层对齐秘钥)
  • 3个关键问题,让你的苹果触控板在Windows上重获新生
  • VSCode低代码表单插件爆发式迭代(2026 Q1深度评测):从拖拽到TypeScript契约自动生成的跃迁之路
  • 【农业农村部2024数字乡村试点推荐配置】:VSCode+Jupyter+GeoPandas实现地块级遥感影像分析——3天掌握农业AI开发起点
  • 从静态到动态:用sd-webui-animatediff解锁AI视频创作的魔法配方 [特殊字符]
  • AI搞定答辩PPT,百考通AI让你告别熬夜,告别焦虑
  • Teamcenter AWC/RCP 根据流程 节点配置对应节点 需要展示的属性和关系 - 张永全
  • 跪求各位学长学姐用血泪教训推荐几款不坑人的AI论文生成器!
  • 网页内容一键归档:用MarkDownload打造个人知识库
  • 思源黑体TTF:免费商用的多语言字体终极指南
  • 告别配置迷茫!Vivado里SRIO IP核的Buffer深度和流控到底怎么选?
  • Path of Building终极指南:5分钟掌握流放之路最强Build规划神器
  • Kindle Comic Converter终极指南:如何将漫画完美适配电子阅读器?
  • 告别混乱!Qt信号槽连接5种方式保姆级对比(含Qt5/6兼容性指南)
  • MathJax 4.0 核心架构深度解析:数学渲染引擎的三大机制与实战应用