如何修复CSV文件中的提前换行错误并合并错位拆分的数据行
解答
读取方式说明
你使用reader.read().splitlines()或者readlines()的读取方式都是正确的,二者的区别仅为readlines()会保留每行末尾的换行符,splitlines()默认会去除换行符。你遇到的行结构错误是CSV本身存在非法提前换行导致的,和读取方式无关。
遍历修改的选择
不要在遍历原列表的过程中直接修改列表的结构(比如删除、插入元素),这种操作很容易引发索引错位、漏读行的问题,更稳妥的方案是新建一个空列表,用来存储已经修复完成的正常行,遍历过程中动态处理行的拼接逻辑即可。
分号计数方案的可行性
这个思路完全可行,正常的分号分隔CSV单行的分号数量是固定的(等于总列数-1),相比仅判断行首尾是否存在分号的方案兼容性更强,就算单行被拆成3段及以上也能准确识别修复。
分号开头行的处理方案
你可以通过新建结果列表的方式处理这类行,逻辑为:判断当前行如果以分号开头,就拼接到结果列表的最后一个元素末尾,否则作为新行加入结果列表,示例实现代码如下:
fixed_lines = [] with open("test.csv", "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: # 先执行基础替换逻辑,同时去掉末尾的换行符 line = line.replace("Foobar", "").rstrip("\n") # 判断是否为需要拼接的错位行 if line.startswith(";"): # 拼接至上一行末尾 fixed_lines[-1] += line else: fixed_lines.append(line) # 可选补充:用分号计数校验修复结果 # 取表头的分号数作为标准值 standard_sep_num = fixed_lines[0].count(";") for idx, line in enumerate(fixed_lines): if line.count(";") != standard_sep_num: # 此处可添加自定义的异常处理逻辑 print(f"第{idx+1}行仍存在格式错误,内容为:{line}")
上述代码处理你给出的示例输入后,得到的结果为:
Col_a;Col_b;Col_c;Col_d 2021;;Bla ;Blub
Blub会正确拼接至上一行的末尾。
内容的提问来源于stack exchange,提问作者sa-biene
相关产品推荐
相关产品推荐

