You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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!')

关键修改说明

  1. 移除无效代码:删掉了原代码中那段逻辑错误且无法执行的循环(for line in r:)——因为data = [line for line in r]已经把读取器的内容耗尽,后续循环不会执行。
  2. 添加列数过滤逻辑:
    • 保留原文件第0行,符合你“除第0行外检查其余行”的要求
    • 以原文件第1行的列数为基准,删除所有列数不匹配的行
  3. 边界情况处理:如果原文件只有一行,自动添加表头行,避免索引越界
  4. 代码规范优化:给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:45:46