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处理功能如数据框操作、数据筛选、聚合等。