Python CSV文件处理详细教程
Python CSV文件处理详细教程1. 模块简介CSVComma-Separated Values逗号分隔值是一种常见的文件格式用于存储表格数据。它使用逗号作为字段分隔符每行代表一条记录。Python的csv模块提供了专门用于处理CSV文件的功能使得读取和写入CSV文件变得简单高效。主要功能包括读取CSV文件内容写入数据到CSV文件处理带标题行的CSV文件使用字典形式读写CSV数据自定义分隔符和引用符处理CSV中的特殊情况2. 核心功能详解2.1 基本CSV读取使用csv.reader对象可以逐行读取CSV文件内容。基本用法importcsv# 读取CSV文件withopen(employees.csv,r,encodingutf-8)asfile:readercsv.reader(file)forrow_num,rowinenumerate(reader,1):print(f第{row_num}行:{row})注意事项使用with语句确保文件正确关闭指定encodingutf-8以正确处理中文字符csv.reader返回的是一个迭代器每次迭代返回一行数据作为列表2.2 CSV写入操作使用csv.writer对象可以将数据写入CSV文件。基本用法importcsv# 准备数据sample_data[[姓名,年龄,城市,职业],[张三,25,北京,工程师],[李四,30,上海,设计师],[王五,28,广州,产品经理]]# 写入CSV文件withopen(employees.csv,w,newline,encodingutf-8)asfile:writercsv.writer(file)writer.writerows(sample_data)print(已创建示例CSV文件 employees.csv)注意事项使用w模式创建新文件或覆盖现有文件设置newline以避免额外的空行writerows()方法可以一次写入多行数据writerow()方法用于写入单行数据2.3 使用DictReader处理带标题的CSVcsv.DictReader可以将CSV文件的第一行作为字段名返回的每行数据是一个字典键为字段名值为对应的数据。基本用法importcsvwithopen(employees.csv,r,encodingutf-8)asfile:dict_readercsv.DictReader(file)forrow_num,rowinenumerate(dict_reader,1):print(f员工{row_num}:)forkey,valueinrow.items():print(f{key}:{value})print()优势可以通过字段名访问数据而不是通过索引代码更具可读性尤其是当CSV文件字段较多时字段顺序变化时代码仍然可以正常工作2.4 使用DictWriter写入数据csv.DictWriter可以将字典数据写入CSV文件需要指定字段名。基本用法importcsv# 准备字段名称和数据fieldnames[姓名,年龄,城市,职业]new_employee{姓名:周九,年龄:29,城市:武汉,职业:前端开发}# 追加新员工数据withopen(employees.csv,a,newline,encodingutf-8)asfile:dict_writercsv.DictWriter(file,fieldnamesfieldnames)dict_writer.writerow(new_employee)print(已使用DictWriter添加新员工)注意事项必须指定fieldnames参数定义字段的顺序字典中的键必须与fieldnames中的字段名匹配如果字典中缺少某些字段会写入空值2.5 自定义分隔符和引用符CSV文件不一定使用逗号作为分隔符csv模块支持自定义分隔符和引用符。基本用法importcsv# 创建使用分号分隔的CSV文件custom_data[[产品名称,价格,库存],[苹果,5.5,100],[香蕉,3.2,200],[橙子,4.8,150]]withopen(products.csv,w,newline,encodingutf-8)asfile:writercsv.writer(file,delimiter;,quotingcsv.QUOTE_MINIMAL)writer.writerows(custom_data)print(已创建使用分号分隔的CSV文件 products.csv)# 读取自定义分隔符的CSV文件withopen(products.csv,r,encodingutf-8)asfile:readercsv.reader(file,delimiter;)forrow_num,rowinenumerate(reader,1):print(f第{row_num}行:{row})常用引用模式csv.QUOTE_MINIMAL只在必要时使用引号csv.QUOTE_ALL对所有字段使用引号csv.QUOTE_NONNUMERIC对非数字字段使用引号csv.QUOTE_NONE不使用引号2.6 处理CSV中的特殊情况CSV文件中可能包含特殊字符如引号、逗号、换行符等csv模块可以正确处理这些情况。基本用法importcsv# 创建包含特殊字符的CSV数据special_data[[姓名,描述],[张三,喜欢Python编程],[李四,爱好: 读书, 游泳, 旅行],[王五,地址: 北京市朝阳区\n邮编: 100000]]withopen(special.csv,w,newline,encodingutf-8)asfile:writercsv.writer(file,quotingcsv.QUOTE_ALL)writer.writerows(special_data)print(已创建包含特殊字符的CSV文件 special.csv)# 读取包含特殊字符的CSV文件withopen(special.csv,r,encodingutf-8)asfile:readercsv.reader(file)forrow_num,rowinenumerate(reader,1):print(f第{row_num}行:{row})注意事项使用quotingcsv.QUOTE_ALL可以确保特殊字符被正确处理包含逗号、引号或换行符的字段会被自动加上引号读取时这些特殊字符会被正确解析3. 实用示例3.1 CSV数据统计示例统计不同城市的员工数量importcsvdefcount_employees_by_city(csv_file):统计不同城市的员工数量city_count{}withopen(csv_file,r,encodingutf-8)asfile:dict_readercsv.DictReader(file)forrowindict_reader:cityrow[城市]ifcityincity_count:city_count[city]1else:city_count[city]1returncity_count# 示例使用if__name____main__:# 假设employees.csv文件已存在city_countscount_employees_by_city(employees.csv)print(各城市员工数量统计:)forcity,countincity_counts.items():print(f{city}:{count}人)3.2 CSV数据转换示例将CSV数据转换为JSON格式importcsvimportjsondefcsv_to_json(csv_file,json_file):将CSV文件转换为JSON文件data[]withopen(csv_file,r,encodingutf-8)asfile:dict_readercsv.DictReader(file)forrowindict_reader:data.append(row)withopen(json_file,w,encodingutf-8)asfile:json.dump(data,file,ensure_asciiFalse,indent2)print(f已将{csv_file}转换为{json_file})# 示例使用if__name____main__:csv_to_json(employees.csv,employees.json)3.3 CSV数据过滤示例过滤特定条件的记录importcsvdeffilter_employees_by_age(csv_file,min_age):过滤年龄大于等于指定值的员工filtered_data[]withopen(csv_file,r,encodingutf-8)asfile:dict_readercsv.DictReader(file)fieldnamesdict_reader.fieldnamesforrowindict_reader:ifint(row[年龄])min_age:filtered_data.append(row)# 保存过滤结果output_filefemployees_age_{min_age}.csvwithopen(output_file,w,newline,encodingutf-8)asfile:dict_writercsv.DictWriter(file,fieldnamesfieldnames)dict_writer.writeheader()dict_writer.writerows(filtered_data)print(f已过滤并保存结果到{output_file})returnfiltered_data# 示例使用if__name____main__:filteredfilter_employees_by_age(employees.csv,30)print(f过滤后共有{len(filtered)}名员工)3.4 CSV数据合并示例合并多个CSV文件importcsvimportosdefmerge_csv_files(input_files,output_file):合并多个CSV文件ifnotinput_files:print(没有输入文件)return# 读取第一个文件的表头withopen(input_files[0],r,encodingutf-8)asfile:dict_readercsv.DictReader(file)fieldnamesdict_reader.fieldnames# 合并数据merged_data[]forcsv_fileininput_files:withopen(csv_file,r,encodingutf-8)asfile:dict_readercsv.DictReader(file)forrowindict_reader:merged_data.append(row)# 写入合并结果withopen(output_file,w,newline,encodingutf-8)asfile:dict_writercsv.DictWriter(file,fieldnamesfieldnames)dict_writer.writeheader()dict_writer.writerows(merged_data)print(f已合并{len(input_files)}个CSV文件到{output_file})print(f总记录数:{len(merged_data)})# 示例使用if__name____main__:input_files[employees1.csv,employees2.csv,employees3.csv]# 过滤存在的文件input_files[fforfininput_filesifos.path.exists(f)]ifinput_files:merge_csv_files(input_files,merged_employees.csv)else:print(没有找到输入文件)4. 代码优化建议使用上下文管理器始终使用with语句来管理文件操作确保文件正确关闭。指定编码在打开文件时明确指定encodingutf-8确保正确处理中文字符。错误处理添加适当的错误处理如FileNotFoundError、PermissionError等。选择合适的读写方式对于简单的CSV文件使用csv.reader和csv.writer对于带标题的CSV文件使用csv.DictReader和csv.DictWriter处理大文件对于大型CSV文件考虑使用生成器表达式或分块处理避免一次性加载所有数据到内存。自定义分隔符当处理非标准CSV文件时记得指定正确的分隔符。引用符设置根据数据特点选择合适的引用模式确保特殊字符被正确处理。字段名处理使用DictReader时注意CSV文件的第一行是否包含字段名。数据类型转换CSV文件中的数据默认都是字符串类型需要根据需要进行类型转换。性能优化对于大量数据的读写考虑使用csv模块的快速模式或使用第三方库如pandas。5. 常见问题与解决方案5.1 问题CSV文件中包含中文字符导致乱码解决方案在打开文件时明确指定encodingutf-8确保中文字符被正确处理。5.2 问题CSV文件读取时出现额外的空行解决方案在打开文件时设置newline避免Python的换行符处理与CSV模块的处理冲突。5.3 问题CSV文件中的数字被读取为字符串解决方案在读取后手动将需要的字段转换为数字类型例如age int(row[年龄])。5.4 问题CSV文件中的字段包含逗号或引号解决方案使用适当的引用模式如quotingcsv.QUOTE_ALL确保特殊字符被正确处理。5.5 问题DictReader读取时字段名包含空格解决方案可以在读取后手动处理字段名去除空格或者在写入时确保字段名不包含空格。5.6 问题大型CSV文件读取内存不足解决方案使用迭代器逐行读取避免一次性加载所有数据到内存。5.7 问题写入CSV文件时日期格式不正确解决方案在写入前将日期转换为适当的字符串格式例如date.strftime(%Y-%m-%d)。6. 总结CSV文件是一种简单而广泛使用的数据交换格式Python的csv模块提供了强大的功能来处理CSV文件。通过本教程你应该已经了解了如何使用csv.reader和csv.writer进行基本的CSV读写操作如何使用csv.DictReader和csv.DictWriter以字典形式处理CSV数据如何自定义分隔符和引用符如何处理CSV中的特殊情况实用的CSV数据处理示例常见问题的解决方案在实际应用中CSV文件处理是一个常见的任务无论是数据导入导出、数据清洗还是数据分析都需要掌握这些基本技能。通过不断练习和实践你将能够更加高效地处理各种CSV文件操作任务。对于更复杂的CSV处理需求你还可以考虑使用第三方库如pandas它提供了更高级的CSV处理功能如数据框操作、数据筛选、聚合等。

相关新闻

排序(选择和快排)

排序(选择和快排)

选择排序 基本思想: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 直接选择排序的特性总结: 直接选择排序思考非常好理解,但是效…

2026/7/15 9:13:34 阅读更多 →
2026技能网络领航者:SkillNet进化引擎深度测评(20万+多源技能覆盖)

2026技能网络领航者:SkillNet进化引擎深度测评(20万+多源技能覆盖)

2026技能网络领航者:SkillNet进化引擎深度测评(20万多源技能覆盖) SkillNet 是由浙江大学、阿里巴巴、蚂蚁集团等 20 余家机构联合推出的大规模 AI 技能开放基础设施(全拼:Skill Network,即“技能网络”&am…

2026/7/12 17:51:32 阅读更多 →
2026年餐饮新风口:小而美模式为何能成行业TOP3增长点?

2026年餐饮新风口:小而美模式为何能成行业TOP3增长点?

我们团队在实践中发现,当前餐饮行业正面临一个结构性矛盾:一边是大型连锁品牌凭借标准化扩张占据市场,另一边是消费者对个性化、体验感和空间效率的要求日益提升。传统“大而全”的餐厅模式,在租金、人力成本高企和翻台率瓶颈的挤…

2026/7/14 22:37:00 阅读更多 →

最新新闻

国产PLC通信避坑:C#解决信捷PLC数据丢包与断线重连实战

国产PLC通信避坑:C#解决信捷PLC数据丢包与断线重连实战

前言:国产PLC的"隐形门槛" 在工控圈子里,西门子、三菱的通信库被研究得透透的,随便搜一下就是现成的轮子。但当你接手一个使用信捷XC/XD系列PLC的项目时,往往会发现:文档少、社区小、坑还特别多。 去年我们给…

2026/7/16 0:38:37 阅读更多 →
C#上位机+ONNX Runtime:毫秒级AI视觉缺陷检测系统落地指南

C#上位机+ONNX Runtime:毫秒级AI视觉缺陷检测系统落地指南

前言:当"算法Demo"撞上"产线节拍" 在工业视觉圈子里,有一个心照不宣的共识:算法工程师交付的Python Demo和现场实际运行的C#上位机之间,隔着一道巨大的工程鸿沟。 我见过太多这样的项目:算法团队…

2026/7/16 0:38:37 阅读更多 →
影刀RPA 数据合并:多表关联与拼接

影刀RPA 数据合并:多表关联与拼接

影刀RPA 数据合并:多表关联与拼接 作者:林焱 什么情况用什么 数据分散在多个文件里——销售数据在A表、客户信息在B表、产品信息在C表,需要合并成一张完整报表。或者按月分开的12个文件需要拼成一整年的数据。在影刀RPA里用pandas的merge、c…

2026/7/16 0:36:35 阅读更多 →
美团开发岗高频算法题清单

美团开发岗高频算法题清单

美团开发岗的算法难度整体不一定最卷,但有一个很鲜明的特点:题目很贴近后台开发常见的数据结构能力。 也就是说,美团更像是在通过算法题看你是不是一个扎实的后台工程师,而不是单纯看你刷了多少偏题怪题。 美团算法面试特点 偏经…

2026/7/16 0:36:35 阅读更多 →
鸿蒙 ArkTS 实战:Cycling Safety Light 从出行记录到状态反馈完整解析

鸿蒙 ArkTS 实战:Cycling Safety Light 从出行记录到状态反馈完整解析

鸿蒙 ArkTS 实战:Cycling Safety Light 从出行记录到状态反馈完整解析 前言 Cycling Safety Light 是一个面向 出行管理与通勤习惯 的鸿蒙 ArkTS 小应用。记录出行条目、站点信息和提醒备注,适合日常出行复盘。 本文基于 entry/src/main/ets/pages/Ind…

2026/7/16 0:32:34 阅读更多 →
Azure Local离线部署之Fallback日志收集

Azure Local离线部署之Fallback日志收集

1. 适用场景 官方原文:"Use appliance fallback logging to collect and send logs to Microsoft when the Azure Local disconnected operations appliance virtual machine (VM) is down. Use this method if standard log collection cant start and you ne…

2026/7/16 0:30:33 阅读更多 →

日新闻

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

本篇深入剖析 ImportantDays 项目的数据持久化方案——基于 HarmonyOS ArkData 模块的 Preferences 轻量级存储,以及 PreferenceUtil 工具类的单例封装。一、HarmonyOS 数据存储方案对比 HarmonyOS 提供了多种数据存储方案:方案适用场景特点Preferences轻…

2026/7/16 0:08:27 阅读更多 →
Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

2026/7/16 0:08:27 阅读更多 →
鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

从鸿蒙 7(HarmonyOS NEXT)开始,官方全面完成了从 ohos.* 零散模块到 kit.* 领域套件的体系重构。对开发者来说,第一道门槛不是 API 用法变化,而是统一的导入规范——旧体系默认导入、解构导入混用的混乱局面被彻底终结…

2026/7/16 0:10:29 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻