CSV文件处理报错求助:删除无效行、替换字符及编码转换
CSV文件处理问题解决指南
你在处理CSV文件时遇到两个典型报错,同时需要完成一系列格式转换需求:
- 报错1:
AttributeError: 'list' object has no attribute 'split'——错误原因是直接对列表调用了仅适用于字符串的split()方法 - 报错2:
ValueError: i/o operation on closed file.——错误原因是在with代码块外(文件已自动关闭)尝试遍历文件对象
你的核心需求:
- 删除前10行无数据内容
- 添加自定义新表头
- 将列分隔符从逗号
,改为分号; - 将所有连字符
-替换为分号; - 文件编码从utf-16转换为utf-8
- 生成新文件并保留有效内容
正确实现代码
import csv # 定义需要删除的行号范围(前10行) rownumbers_to_remove = set(range(1, 11)) processed_rows = [] # 读取utf-16编码的输入文件,处理数据 with open('input.csv', 'r', encoding="utf-16") as read_file: reader = csv.reader(read_file, delimiter=",") for row_number, row in enumerate(reader, start=1): # 跳过前10行无效内容 if row_number in rownumbers_to_remove: continue # 遍历每个单元格,替换所有连字符为分号 modified_row = [cell.replace('-', ';') for cell in row] processed_rows.append(modified_row) # 写入utf-8编码的输出文件,使用分号作为列分隔符 with open('output.csv', 'w', newline='', encoding="utf-8") as write_file: writer = csv.writer(write_file, delimiter=";") # 写入自定义表头 writer.writerow(['column1', 'column2', 'column3', 'column4', 'column5']) # 写入处理后的有效数据行 writer.writerows(processed_rows)
代码关键说明
- 删除前10行:通过
enumerate给每行标记行号,直接跳过行号1到10的内容 - 替换连字符:针对每行的每个字符串单元格执行
replace操作,避免对列表直接调用字符串方法 - 切换列分隔符:创建
csv.writer时指定delimiter=";",自动用分号分隔列数据 - 编码转换:读取时指定
encoding="utf-16",写入时指定encoding="utf-8",完成编码转换 - 避免文件关闭报错:所有文件操作都在
with代码块内执行,确保文件对象在有效生命周期内使用 - 添加新表头:在写入数据前,先通过
writerow写入自定义的表头内容
内容的提问来源于stack exchange,提问作者gyuszmok
相关产品推荐
相关产品推荐

