欢迎光临
我们一直在努力

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

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

这本教程细致入微地阐述了怎样去运用能够高精度且快速处理csv文件的方法, 其中包含了将并非属于数据内容的行予以删除, 为其添加根据自身需求定制的表头, 把呈现数据的字段之间所使用的分隔符号进行更改, 去代替数据字段内容里突显的特殊字符, 以及针对文件进行在编码方面的转变例如像从utf – 16实现往utf – 8的转换等关键的操作。凭借实际给出的代码的示例, 展示了怎样躲避在常规当中容易出现的输入输出错误以及会导致程序运行出现意外状况的类型错误, 对具有条理、在内存使用方面很友好的csv数据进行清理以及使其更加符合规范而成为符合各自明确且具体需求的新的文件。

在开展数据处理工作期间, CSV(逗号分隔值)文件凭借其简洁特性而被广泛加以运用, 可是, 原始的CSV文件常常存有格式不符合规范、涵盖冗余信息、编码不一致这类问题, 必须要进行清理以及转换方可用于后续的进一步分析, 本教程会引导您去处理一项典型的CSV文件清理任务, 其中涵盖:

针对特定行进行剔除操作如下: 具体是把文件起始部分之中 , 那些并不归属实际数据范畴的行给移除掉 , 像空行或者分隔线这类情况。为处理后的相关数据 , 添加清晰明确的列名 以作为新的文件头部。对字段分隔符予以变更 , 会把原本是逗号作为分隔符的形式转变为分号作为分隔符。把数据字段里特定的字符 , 比如说连字符 – , 替换成其他字符 , 例如换成分号 ;。将输入文件所具备的编码UTF – 16 , 转变为输出文件的编码UTF – 8。在不改动原文件的情况下 , 生成一个包含所有更改内容的新CSV文件。常见错误分析与规避

在开展文件有关的操作期间, 开发者常常会碰到一些问题。弄明白这些错误的根本性根源有助于我们去编撰更正派强劲牢固的代码。

1. : I/O on file.

此种错误常常于尝试针对已然关闭的文件句柄去开展读写操作之际出现。于其中, 运用 with open(…) as : 这一语句乃是管理文件资源的最优实践行径。当代码块执行完毕之时或者遭遇异常情况之际, 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. : 'list' has no 'split'

此错误所呈现的意思是, 您进行了这样一种尝试, 即在一个列表对象之上调用 split() 方法。split()方法有一种自身的特定归属, 它只适用于字符串(str)对象。其作用在于, 按照所指定的分隔符, 把字符串拆分成字符串所构成的列表。然而, 列表对象并不具备这个方法。

错误示例:

lines = [] # 这是一个列表
lines_ = lines.split('-') # 错误:列表没有split方法

下面要说的方案是: 要去确认一下, 您当前是不是正在针对字符串开展 split() 的操作。假设的情形是, 您有了要想处理列表当中每一个字符串元素的想法, 那么这种情况下, 就需要去遍历这个列表, 并且针对列表里的每一个元素, 都要单独去调用 split() 或者 ()。

解决方案:使用 csv 模块进行流式处理

将CSV文件进行处理时, 要想高效又稳健, csv模块是首选的工具。此工具能够对头CSV中文件包括字段里头的逗号、引号等各种各样复杂状况正确实施处理。与此同时, 采用流式处理也就是逐行去读取、写入形式, 能够防止将整个的文件加载至内存当中, 而这件事情处理大型文件的时候特别关键。

1. 文件打开与编码处理

首先, 我们要以正确的编码去打开输入的文件。并且, 要以目标编码打开输出的文件。接着, 运用with语句来同时管理两个文件句柄。以此来确保, 它们在操作完成之后能够自动关闭。

3.14.2

3.14.2是编程语言于2025年12月5日所发布的稳定版本, 它归属于3.14系列的第二个维护更新, 该版本涵盖了18项修复, 着重破解了多进程、数据类以及正则表达式等模块的回归问题, 还修复了CVE – 2025 – 12084等安全漏洞, 此版本意味着自由线程模式(移除GIL)正式得到官方支持, 是发展道路上的重要里程碑。

下载

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

2. 初始化 CSV 读取器和写入器

使用 csv. 和 csv. 对象来处理CSV数据。

reader = csv.reader(read_file, delimiter=",") # 输入文件使用逗号分隔
writer = csv.writer(write_file, delimiter=";") # 输出文件使用分号分隔

3. 写入新的文件头

在处理数据之前,首先将定义好的新文件头写入输出文件。

writer.writerow(new_header)

4. 过滤非数据行

原始文件当中呢, 有可能会包含着空行, 或者是分隔线, 又或者是其他的并不包含实际数据的行。我们能够借助检查行的长度这般的方式, 又或是通过查看行的内容这种办法, 来进行动态的过滤这些行。

在这一例子里面, len(row)等于1能够有效地滤除掉empty line以及————————————这类行, 原因在于它们不存在逗号, 会被csv解析成仅仅含有一个元素的列表。

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)

完整示例代码

联同上述全部步骤, 以下所呈现的是完备的代码, 旨在将其借由.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)

注意事项:

总结

经过这个教程, 我们学到了怎样去运用那个csv模块, 去有效地做清理, 做格式化, 还有转换CSV文件。关键之处在于要明白with open()呢是拿来进行文件资源管理的, 要正确地去使用csv.和csv.对象, 以及得利用列表推导式来对数据进行高效的转换。采用流式处理, 不但能够避免内存溢出的情况发生, 还能够明显地提升处理大型文件时的效率以及鲁棒性。掌握了这些技巧, 将会让您能够轻松地去应对各式各样复杂的CSV数据处理挑战。

赞(0)
未经允许不得转载:171主机测评 » Python CSV文件处理:清理、格式化与编码转换实战
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址