使用Python修复无引号CSV文件中行内CRLF导致的行拆分问题
使用Python修复无引号CSV文件中行内CRLF导致的行拆分问题
看起来你碰到了无引号分隔文本文件里的经典坑——字段里的换行符直接把一条完整记录拆成了好几行,导致列数和表头对不上。别担心,我给你一个针对性的Python解决方案,核心思路是根据表头的预期列数来判断行是否完整,把拆分的行合并回原记录。
解决方案代码
def fix_line_breaks(input_file_path, output_file_path, delimiter='~'): # 打开输入输出文件,指定newline=''避免自动转换换行符 with open(input_file_path, 'r', newline='') as infile, open(output_file_path, 'w', newline='') as outfile: # 读取表头并计算预期列数 header = infile.readline().strip() expected_cols = len(header.split(delimiter)) # 先把表头写入输出文件 outfile.write(header + '\n') # 缓存正在构建的不完整记录 incomplete_record = [] for line in infile: # 只去掉行尾的CR/LF,保留字段内的换行内容 cleaned_line = line.rstrip('\r\n') line_parts = cleaned_line.split(delimiter) if not incomplete_record: # 还没有缓存的不完整记录,直接存入 incomplete_record = line_parts else: # 检查合并当前行后是否能凑够预期列数 if len(incomplete_record) + len(line_parts) - 1 == expected_cols: # 当前行的第一部分属于上一个字段,剩下的是新字段 incomplete_record[-1] += '\n' + line_parts[0] incomplete_record.extend(line_parts[1:]) # 记录完整了,写入文件 outfile.write(delimiter.join(incomplete_record) + '\n') # 重置缓存 incomplete_record = [] else: # 当前行全部属于上一个字段,直接追加 incomplete_record[-1] += '\n' + cleaned_line # 处理最后一条可能遗留的完整记录 if incomplete_record and len(incomplete_record) == expected_cols: outfile.write(delimiter.join(incomplete_record) + '\n') # 调用示例:替换成你的输入输出文件路径 fix_line_breaks('source_data.txt', 'fixed_data.txt', delimiter='~')
代码逻辑说明
- 基准列数确定:先读取表头,拆分后得到每条记录应该有的列数(你的示例里是5列)。
- 不完整记录缓存:用
incomplete_record变量临时存储还没凑够列数的拆分记录。 - 逐行处理:
- 如果缓存为空,直接把当前行拆分后存入缓存。
- 如果缓存已有内容,说明当前行是上一条记录的延续:
- 要是合并后能凑够预期列数,就把当前行的第一部分追加到缓存的最后一个字段,剩下的部分作为新字段加入缓存,然后写入完整记录并重置缓存。
- 要是还不够,就把当前行的全部内容追加到缓存的最后一个字段。
- 收尾处理:最后检查是否有遗留的完整记录,确保没有遗漏。
注意事项
- 这个方案默认只有最后一个字段会出现行内换行(和你的示例数据匹配),如果其他字段也可能有换行,需要调整判断逻辑。
- 如果你的字段里包含分隔符
~,这个方案会失效——这种情况建议改用带引号的CSV格式,但你的问题里是无引号场景,所以暂时适用。 - 测试时可以先用你的示例数据跑一遍,修复后的第三条记录会把拆分的三行description合并成一个字段,列数和表头一致。
备注:内容来源于stack exchange,提问作者curry_b
相关产品推荐
相关产品推荐

