新闻中心
Python CSV文件处理:清理、格式化与编码转换实战

本教程详细介绍了如何使用python高效处理csv文件,涵盖了删除非数据行、添加自定义表头、修改字段分隔符、替换字段内容中的特定字符以及进行文件编码转换(如utf-16到utf-8)等核心操作。通过实例代码,演示了如何避免常见的i/o错误和类型错误,实现结构化、内存友好的csv数据清理与格式化,最终生成满足特定需求的新文件。
在数据处理工作中,CSV(逗号分隔值)文件因其简洁性而广泛应用。然而,原始的CSV文件往往存在格式不规范、包含冗余信息、编码不一致等问题,需要进行清理和转换才能用于进一步分析。本教程将引导您使用Python处理一个典型的CSV文件清理任务,包括:
- 删除特定行: 移除文件开头不包含实际数据的行,例如空行或分隔线。
- 添加新的文件头: 为处理后的数据定义清晰的列名。
- 更改字段分隔符: 将原始的逗号分隔符转换为分号分隔符。
- 替换字段内容: 将数据字段中的特定字符(如连字符-)替换为其他字符(如分号;)。
- 转换文件编码: 将输入文件的UTF-16编码转换为输出文件的UTF-8编码。
- 生成新文件: 在不修改原文件的情况下,创建包含所有更改的新CSV文件。
常见错误分析与规避
在进行文件操作时,开发者常会遇到一些问题。理解这些错误的根本原因有助于我们编写更健壮的代码。
1. ValueError: I/O operation on closed file.
此错误通常发生在尝试对已关闭的文件句柄进行读写操作时。在Python中,使用 with open(...) as file_object: 语句是管理文件资源的最佳实践。当代码块执行完毕或遇到异常时,with 语句会自动调用文件对象的 close() 方法,确保文件被正确关闭。
错误示例:
with open('input.csv', 'r') as read_file:
# do something with read_file
pass # 文件在此处被关闭
# 尝试再次读取已关闭的文件,将导致错误
for row in read_file:
print(row)解决方案: 确保所有文件操作都在 with 语句块内部进行,或者在同一个 with 语句中同时打开输入和输出文件。
2. AttributeError: 'list' object has no attribute 'split'
此错误表明您尝试在一个列表对象上调用 split() 方法。split() 方法是字符串(str)对象特有的,用于将字符串按指定分隔符拆分成字符串列表。列表对象没有此方法。
错误示例:
lines = [] # 这是一个列表
lines_ = lines.split('-') # 错误:列表没有split方法解决方案: 确认您正在对字符串进行 split() 操作。如果您想处理列表中的每个字符串元素,需要遍历列表并对每个元素单独调用 split() 或 replace()。
解决方案:使用 csv 模块进行流式处理
为了高效且稳健地处理CSV文件,Python的 csv 模块是首选工具。它能够正确处理CSV文件的各种复杂情况,如字段中的逗号、引号等。同时,采用流式处理(即逐行读取和写入)可以避免将整个文件加载到内存中,这对于处理大型文件尤为重要。
1. 文件打开与编码处理
我们首先需要以正确的编码打开输入文件,并以目标编码打开输出文件。使用 with 语句同时管理两个文件句柄,确保它们在操作完成后自动关闭。
import csv
input_file_path = 'input.csv'
output_file_path = 'output.csv'
new_header = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8']
with open(input_file_path, 'r', encoding="utf-16") as read_file, \
open(output_file_path, 'w', newline='', encoding="utf-8") as write_file:
# 后续操作将在此处进行
pass- encoding="utf-16": 指定输入文件的编码。
- encoding="utf-8": 指定输出文件的编码。
- newline='': 这是 csv 模块推荐的做法,用于避免在Windows系统上写入时出现额外的空行。
2. 初始化 CSV 读取器和写入器
使用 csv.reader 和 csv.writer 对象来处理CSV数据。
Lateral App
整理归类论文
85
查看详情
reader = csv.reader(read_file, delimiter=",") # 输入文件使用逗号分隔
writer = csv.writer(write_file, delimiter=";") # 输出文件使用分号分隔3. 写入新的文件头
在处理数据之前,首先将定义好的新文件头写入输出文件。
writer.writerow(new_header)
4. 过滤非数据行
原始文件可能包含空行、分隔线或其他不包含实际数据的行。我们可以通过检查行的长度或内容来动态过滤这些行。
- 过滤空行或分隔线(如全连字符的行): 如果一行被解析后只有一个字段,且该字段为空或由特定字符组成(如--------------------),则很可能是不需要的数据。
- 更健壮的过滤(基于数据类型): 对于结构化数据,可以尝试将某个关键字段转换为预期的数据类型(如浮点数)。如果转换失败,则说明该行不是有效数据行。
在本例中,len(row) == 1 可以有效地过滤掉 empty line 和 ------------------------------------ 这样的行,因为它们不包含逗号,会被 csv.reader 解析为只含一个元素的列表。
for row in reader:
# 过滤掉单字段行(如空行或全连字符行)
if len(row) == 1:
continue
# 更高级的过滤示例:如果最后一列不是有效的浮点数,则跳过
# try:
# _ = float(row[-1])
# except ValueError:
# continue
# ... 处理并写入有效行5. 替换字段内容中的连字符
遍历当前行的每个字段,并将字段内的所有连字符 - 替换为分号 ;。这可以通过列表推导式高效完成。
# 替换行中每个字段的连字符为分号
processed_row = [field.replace('-', ';') for field in row]需要注意的是,这里替换的是字段 内部 的连字符,而不是字段之间的分隔符。
6. 写入处理后的行
将处理后的行写入输出文件。
writer.writerow(processed_row)
完整示例代码
结合上述所有步骤,以下是完整的Python代码,用于实现CSV文件的清理、格式化和转换。
import csv
def process_csv_file(input_file_path, output_file_path, new_header):
"""
处理CSV文件,包括:
1. 删除非数据行(如空行或分隔线)
2. 添加新的文件头
3. 更改分隔符从逗号(,)到分号(;)
4. 替换字段内容中的连字符(-)为分号(;)
5. 转换编码从UTF-16到UTF-8
Args:
input_file_path (str): 输入CSV文件的路径。
output_file_path (str): 输出CSV文件的路径。
new_header (list): 新的文件头列表。
"""
try:
with open(input_file_path, 'r', encoding="utf-16") as read_file, \
open(output_file_path, 'w', newline='', encoding="utf-8") as write_file:
reader = csv.reader(read_file, delimiter=",")
writer = csv.writer(write_file, delimiter=";")
# 1. 写入新的文件头
writer.writerow(new_header)
# 2. 逐行读取、处理并写入
for row in reader:
# 3. 过滤非数据行
# 如果行只有一个字段,通常表示是空行或分隔线(如全连字符行)
if len(row) == 1:
# 进一步检查是否是全连字符行,以确保准确性(可选,len(row)==1已足够)
# if all(c == '-' for c in row[0].strip()):
# continue
continue
# 4. 替换字段内容中的连字符(-)为分号(;)
processed_row = [field.replace('-', ';') for field in row]
# 5. 写入处理后的行
writer.writerow(processed_row)
print(f"CSV文件处理完成!输出文件已保存至:{output_file_path}")
except FileNotFoundError:
print(f"错误:文件 '{input_file_path}' 未找到。")
except UnicodeDecodeError:
print(f"错误:无法使用 'utf-16' 编码解码文件 '{input_file_path}'。请检查文件编码。")
except Exception as e:
print(f"处理文件时发生未知错误:{e}")
# 定义输入和输出文件路径
input_csv = 'input.csv'
output_csv = 'output.csv'
# 定义新的文件头
header_columns = [
'CarType', 'Date', 'TimeRange',
'AvgValue', 'ShareExcludedOther'
]
# 调用函数进行处理
process_csv_file(input_csv, output_csv, header_columns)注意事项:
- 上述代码中的 new_header 示例仅包含5列,与原始数据中的实际列数可能不完全匹配。请根据您的实际数据调整 new_header 的内容和长度。
- 过滤逻辑 if len(row) == 1: 适用于原始文件中没有逗号的空行或分隔线。如果您的非数据行中包含逗号,则需要更复杂的过滤逻辑,例如检查特定列是否为空或符合特定模式。
- 如果输入文件中的列数与 new_header 的列数不一致,您可能需要在 processed_row 写入之前进行列的增删或重排。
总结
通过本教程,我们学习了如何使用Python的 csv 模块有效地清理、格式化和转换CSV文件。关键在于理解 with open() 进行文件资源管理、正确使用 csv.reader 和 csv.writer 对象、以及利用列表推导式对数据进行高效
转换。采用流式处理不仅能避免内存溢出,还能显著提高处理大型文件的效率和鲁棒性。掌握这些技巧,将使您能够轻松应对各种复杂的CSV数据处理挑战。
以上就是Python CSV文件处理:清理、格式化与编码转换实战的详细内容,更多请关注其它相关文章!
# 不包含
# 云梦企业网站推广厂家
# 网站建设发票怎么填写
# 直通车营销场景新品推广
# 拼音seo
# seo搜索推广电话
# 淄川网站建设设计好
# 商丘 峰少 seo
# 艺术网站建设游戏教案
# 宝安网站建设宣传
# 东营电商网站seo
# 流式
# 遍历
# 句柄
# python
# 化与
# 您的
# 的是
# 分隔线
# 分隔符
# 转换为
# csv文件
# windows系统
# win
# csv
# 工具
# 编码
# windows
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Go语言中JSON数据解析与字段访问教程
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
12306选座怎么选到商务座_12306商务座选择与配置说明
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
微信语音通话掉线如何解决 微信语音通话稳定优化方法
韩剧圈正版入口页面_韩剧圈官网登录链接
age动漫网站入口 age动漫官网直接访问入口
必由学官方网站入口 必由学学生教师共用登录通道
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
C++如何实现单例模式_C++设计模式之线程安全的单例写法
Tabulator表格中精确实现日期时间排序的指南
163邮箱注册官网 免费申请163个人邮箱
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
Steam官网入口直达 Steam注册及登录步骤
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
夸克AO3官网入口_AO3镜像网站2025推荐
微信网页版官方快速登录入口 微信网页版网页版账号直达
电脑IP地址怎么查 查看本机IP地址的几种方法
今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
德邦快递查询平台 德邦快递物流信息查询入口
如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流
深入理解J*a编译器的兼容性选项:从-source到--release
mcjs网页版在线存档 mcjs云存档登录入口
在哪找SublimeJ远程工具_SFTP插件配置教程
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
BetterDiscord插件中安全更新用户简介的实践指南
快手赚钱渠道_快手收益来源
J*aScript教程:根据元素文本内容动态设置背景色
CSS布局中意外空白:解决padding-top导致的顶部间距问题
qq游戏大厅官方下载_qq游戏免费下载安装入口
J*a递归快速排序中静态变量导致数据累积问题的解决方案
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
如何在网页中实现特定地点的随机图片展示
2025-2030年全球乘用车销量预测:新能源成增长主力
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
b站如何看历史记录_b站观看历史找回方法
顺丰快递查询系统 官方正版查询入口
邮政快递单号查询入口 邮政快递物流信息在线查询入口
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
poki免费入口快捷访问 poki人气小游戏直接玩站点
J*aScript生成器_j*ascript异步迭代


2025-12-05
浏览次数:次
返回列表