Python处理CSV文件:合并因回车拆分的行
处理CSV中错误换行的行合并问题
嘿,我懂你遇到的麻烦——CSV里有些行被意外的回车拆成了两半,导致csv.reader没法正确解析对吧?我来给你分享个实用的解决方案,分思路和代码实现两部分:
核心思路
问题的关键在于,这些被拆分的行本质是不完整的CSV行(比如引号没闭合、字段没结束),所以不能直接把原文件丢给csv.reader,得先做一步预处理:
- 逐行读取文件内容,维护一个「待完成的行片段」
- 判断当前拼接后的片段是否为完整CSV行:最可靠的判断方式是统计片段里的双引号数量——标准CSV中,字段内的引号会用双引号转义,所以完整行的引号总数一定是偶数
- 确认是完整行后,输出拼接好的内容,再开始处理下一个片段
代码实现
下面是可直接复用的代码:
import csv def fix_broken_csv_lines(file_path): current_fragment = [] with open(file_path, encoding="utf-8") as input_file: for line in input_file: # 去掉行尾的回车换行,保留字段内的其他内容 cleaned_line = line.rstrip('\r\n') current_fragment.append(cleaned_line) # 统计当前拼接内容的双引号总数 total_quotes = ''.join(current_fragment).count('"') # 引号数为偶数时,说明这是一个完整的CSV行 if total_quotes % 2 == 0: yield ','.join(current_fragment) current_fragment = [] # 处理文件末尾可能遗留的未完成片段 if current_fragment: yield ','.join(current_fragment) # 使用示例 # 先修复行,再交给csv.reader解析 fixed_rows = fix_broken_csv_lines('/inputfile.csv') reader = csv.reader(fixed_rows, delimiter=',', quotechar='"') # 测试输出解析后的行 for row in reader: print(row)
补充说明
- 这个方法优先处理引号未闭合导致的换行问题,这是CSV行拆分最常见的原因,比单纯判断行尾是否为逗号要可靠得多
- 如果你的CSV没有带引号的字段,也可以调整判断逻辑(比如检查每行字段数是否符合预期),但引号判断的通用性更强
- 函数用了生成器
yield,不会一次性把整个文件读进内存,处理大文件也毫无压力
内容的提问来源于stack exchange,提问作者Sinan
相关产品推荐
相关产品推荐

