如何使用Python CSV Reader删除每行除首尾逗号外的所有多余逗号?
解决CSV中间列含多余逗号的处理方案
嘿,这个场景我碰到过好几次——这种格式有点小问题的CSV,确实得绕开默认的CSV解析逻辑来处理。既然你明确知道文件只有三列,而且多余的逗号全卡在中间列里,那我们可以用「预处理+CSV Reader」的组合来搞定,给你两种实用方案参考:
方案一:预处理每行后用CSV Reader读取
默认的CSV Reader会把中间列里的逗号当成列分隔符,导致行被拆成更多列,所以我们先把每行里除了第一个和最后一个逗号之外的逗号全部去掉,再交给CSV Reader处理:
import csv def fix_corrupted_line(line): # 定位第一个逗号的位置 first_comma_idx = line.find(',') if first_comma_idx == -1: return line # 没有逗号的行直接返回 # 定位最后一个逗号的位置 last_comma_idx = line.rfind(',') if first_comma_idx == last_comma_idx: return line # 只有一个逗号的行直接返回 # 拆分并清理中间列的逗号 column1 = line[:first_comma_idx] column2 = line[first_comma_idx+1:last_comma_idx].replace(',', '') column3 = line[last_comma_idx+1:] # 重新组合成标准CSV行 return f"{column1},{column2},{column3}" # 处理文件 with open('corrupted.csv', 'r', encoding='utf-8') as input_file, \ open('fixed.csv', 'w', newline='', encoding='utf-8') as output_file: # 用生成器把每行预处理后传给CSV Reader csv_reader = csv.reader((fix_corrupted_line(line) for line in input_file), delimiter=',') csv_writer = csv.writer(output_file) for row in csv_reader: # 现在row就是正确的三列数据了,可直接处理或写入新文件 csv_writer.writerow(row)
这个方案的好处是保留了CSV模块处理换行、引号(如果有的话)的能力,同时解决了中间列逗号的问题。
方案二:直接按行分割处理(更轻量化)
如果你的文件没有复杂的引号嵌套,也可以跳过CSV Reader,直接按行处理,效率会更高一点:
import csv with open('corrupted.csv', 'r', encoding='utf-8') as input_file, \ open('fixed.csv', 'w', newline='', encoding='utf-8') as output_file: csv_writer = csv.writer(output_file) for line in input_file: line = line.strip() first_comma_idx = line.find(',') last_comma_idx = line.rfind(',') # 处理格式异常的行(可选,根据你的需求调整) if first_comma_idx == -1 or last_comma_idx == -1 or first_comma_idx == last_comma_idx: csv_writer.writerow([line]) continue # 提取并清理三列数据 col1 = line[:first_comma_idx] col2 = line[first_comma_idx+1:last_comma_idx].replace(',', '') col3 = line[last_comma_idx+1:] csv_writer.writerow([col1, col2, col3])
注意事项
- 如果你CSV文件的编码不是
utf-8,记得把代码里的encoding参数改成对应的编码(比如gbk); - 对于格式异常的行(比如没有逗号、只有一个逗号),代码里做了简单的保留处理,你可以根据实际需求改成跳过或其他逻辑;
- 如果中间列原本有引号包裹逗号,你可能需要先去掉引号再替换逗号,这个可以在预处理步骤里加额外的逻辑。
内容的提问来源于stack exchange,提问作者user3647558
相关产品推荐
相关产品推荐

