Python补全CSV缺失列异常:特定场景下数据错位问题排查
问题分析
你的代码核心问题是直接按位置插入列时,没有维护原数据列与表头的对应关系。当新列插入到原有列中间时,原数据行的后续列会被挤到新的位置,导致值错位。比如Table1的原数据行[1,2,3,5,6,7,888]对应原表头a,b,c,d,e,f,g,替换表头为a,b,c,c(c),d,e,f,g后,直接在第4位插入0的话,原d列的5会被留在第4位(变成c(c)的值),而新的d列位置被插入0,这就完全搞反了。
修正方案
正确的做法是用字典映射来处理每一行数据:先把原表头和行数据配对成字典,然后遍历完整表头的每个字段,从字典中取值,没有的字段填0。这样无论列的顺序如何,都能保证值和表头正确对应。
修正后的代码:
import os import csv # 获取脚本所在目录 script_directory = os.path.dirname(__file__) folder_path = script_directory # 获取所有CSV文件 csv_files = [f for f in os.listdir(folder_path) if f.endswith(".csv")] # 找到表头列数最多的文件,获取完整表头 max_columns_file = max( csv_files, key=lambda fn: len(next(csv.reader(open(os.path.join(folder_path, fn), "r", newline=""), delimiter=";"))) ) with open(os.path.join(folder_path, max_columns_file), "r", newline="") as f: full_header = next(csv.reader(f, delimiter=";")) # 处理每个CSV文件 for file_name in csv_files: file_path = os.path.join(folder_path, file_name) processed_rows = [] with open(file_path, "r", newline="") as f: reader = csv.reader(f, delimiter=";") original_header = next(reader) # 先添加完整表头到结果 processed_rows.append(full_header) # 处理每一行数据 for row in reader: # 原数据转字典:表头字段 -> 对应值 row_dict = dict(zip(original_header, row)) # 遍历完整表头,生成新行:有值取原字典,无则填0 new_row = [row_dict.get(col, "0") for col in full_header] processed_rows.append(new_row) # 写入修改后的文件 with open(file_path, "w", newline="") as f: writer = csv.writer(f, delimiter=";") writer.writerows(processed_rows) # 打印差异信息(可选) missing_cols = [col for col in full_header if col not in original_header] extra_cols = [col for col in original_header if col not in full_header] print(f"处理完成: {file_name}") if missing_cols: print(f"补充的列: {', '.join(missing_cols)}") if extra_cols: print(f"多余的列(已移除): {', '.join(extra_cols)}") print("---")
关键改动说明
- 用字典映射替代位置插入:通过
dict(zip(original_header, row))把原行数据转换成键值对,确保每个值都和原表头字段绑定,不会因为列顺序变化错位。 - 按完整表头生成新行:遍历完整表头的每个字段,用
row_dict.get(col, "0")获取对应值,缺失的字段自动填充0,完美匹配预期结果。 - 简化逻辑:去掉了复杂的位置计算和插入操作,代码更易读且不易出错。
测试你的场景:
Table1.csv处理后,新行[1,2,3,"0",5,6,7,888],对应表头a,b,c,c(c),d,e,f,g,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

