如何用Python删除CSV文件中列数不匹配的行
解决CSV文件列数不匹配行的删除问题
以下是修改后的代码,实现了保留原文件第0行(长度可特殊),删除其余列数不匹配的行,同时保留你原有的替换表头功能:
import glob import os import csv import io # 路径设置 path = 'C:/Users/*/Desktop/Current Project/J20102/Test data' # 机器ID相关 machineID = ('14:14:08','21012','223','0','1098','0','031','810','12','01','092','048','0008','02') # 趋势数据表头和日期 TDID = ('TD','08/24/2021') trendHeader = ('Date/Time','G120010','M129000','G110100','M119030','G112070','G112080','G111030','G127020','G127030','G120020','G120030','G121020','G111040','G112010','P102000','G112020','G112040','G112090','G110050','G110060','G110070','T111100') TDmachineID = TDID + machineID # 获取所有CSV文件 TD_files = glob.glob(os.path.join(path,"*.csv"), recursive=True) for f in TD_files: with io.open(f, newline='', encoding='latin1') as g: # 读取文件并去除空字符 r = csv.reader((line.replace('\0','') for line in g)) data = [line for line in r] # 核心:过滤列数不匹配的行 filtered_data = [] if data: # 保留原文件第0行(按需求允许其长度特殊) filtered_data.append(data[0]) if len(data) > 1: # 以原文件第1行的列数为基准,过滤后续行 benchmark_col_count = len(data[1]) for row in data[1:]: if len(row) == benchmark_col_count: filtered_data.append(row) # 替换前两行为自定义内容 filtered_data[0] = TDmachineID if len(filtered_data) > 1: filtered_data[1] = trendHeader else: # 处理原文件只有一行的边界情况,自动添加表头 filtered_data.append(trendHeader) # 写入处理后的文件 with open(f,'w',newline='') as g: w = csv.writer(g) w.writerows(filtered_data) print('Complete!')
关键修改说明
- 移除无效代码:删掉了原代码中那段逻辑错误且无法执行的循环(
for line in r:)——因为data = [line for line in r]已经把读取器的内容耗尽,后续循环不会执行。 - 添加列数过滤逻辑:
- 保留原文件第0行,符合你“除第0行外检查其余行”的要求
- 以原文件第1行的列数为基准,删除所有列数不匹配的行
- 边界情况处理:如果原文件只有一行,自动添加表头行,避免索引越界
- 代码规范优化:给machineID等元组变量添加括号,可读性更强
可选调整
如果你的数据行必须和自定义的trendHeader列数完全匹配(而非原文件第1行),可以把过滤逻辑替换为:
# 核心:过滤列数不匹配的行 filtered_data = [] correct_col_count = len(trendHeader) if data: # 保留原文件第0行 filtered_data.append(data[0]) # 只保留列数与表头一致的行 for row in data[1:]: if len(row) == correct_col_count: filtered_data.append(row)
内容的提问来源于stack exchange,提问作者Kyle Lucas
相关产品推荐
相关产品推荐

