CSV文件中含\n开头行的合并问题及无效Python代码求助
解决CSV文件中换行符导致行格式异常的问题
问题描述
我有一个包含大量CSV文件的文件夹,这些CSV文件以分号;为分隔符。问题在于表格某列文本中存在以\n开头的行,换行符导致这些行长度与其他行不一致。我尝试将以\n开头的行合并到上一行,以下是我的代码,虽无报错但未解决问题,恳请提供更优方案。
with open(path_csvs, 'r',encoding='latin-1') as f: lineas = f.readlines() with open(path_csvs, 'w',encoding='latin-1') as f: i = 0 while i < len(lineas): if i < len(lineas)-1 and lineas[i].startswith('\n'): f.write(lineas[i].rstrip() + ' ' + lineas[i-1].lstrip()) i += 2 else: f.write(lineas[i]) i += 1
问题分析
你的代码存在几个关键问题:
- 拼接顺序错误:检测到异常行时,你把当前行和上一行的顺序搞反了,应该是把异常行内容合并到上一行末尾,而非反过来。
- 判断条件太局限:只处理了开头是纯
\n的行,但实际场景中,换行的内容可能是上一行文本的延续,开头可能直接是文本,并非纯换行符。 - 原地修改风险高:直接读写同一个文件,若处理逻辑出错,可能导致原文件损坏。
优化方案
方案1:基于分隔符数量判断合并异常行
核心逻辑是通过每行的分号数量判断是否为完整行,若数量不符则合并到上一行。
import os def fix_csv_file(file_path): # 读取所有行并去除末尾换行符 with open(file_path, 'r', encoding='latin-1') as f: lines = [line.rstrip('\n') for line in f] if not lines: return fixed_lines = [] # 以第一行的分号数量作为完整行的标准 current_line = lines[0] expected_sep_count = current_line.count(';') for line in lines[1:]: sep_count = line.count(';') # 分号数量不符,说明是上一行的延续 if sep_count != expected_sep_count: current_line += ' ' + line.lstrip() else: fixed_lines.append(current_line) current_line = line # 加入最后一行 fixed_lines.append(current_line) # 写入修复后的内容 with open(file_path, 'w', encoding='latin-1') as f: f.write('\n'.join(fixed_lines)) # 遍历文件夹处理所有CSV文件 folder_path = "你的文件夹路径" for filename in os.listdir(folder_path): if filename.endswith('.csv'): file_path = os.path.join(folder_path, filename) fix_csv_file(file_path)
方案2:使用专业CSV库处理
Python内置的csv库可以自动识别字段内的换行符,只要字段格式规范(或通过配置适配),能更可靠地修复CSV格式。
import csv import os def fix_csv_with_lib(file_path): rows = [] # 读取CSV,允许字段内换行,指定分隔符为分号 with open(file_path, 'r', encoding='latin-1', newline='') as f: reader = csv.reader(f, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL) for row in reader: rows.append(row) # 写入修复后的CSV,保证格式合规 with open(file_path, 'w', encoding='latin-1', newline='') as f: writer = csv.writer(f, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL) writer.writerows(rows) # 遍历文件夹处理所有CSV文件 folder_path = "你的文件夹路径" for filename in os.listdir(folder_path): if filename.endswith('.csv'): file_path = os.path.join(folder_path, filename) fix_csv_with_lib(file_path)
说明
- 方案1适用于所有CSV格式,无需依赖字段是否被引号包裹,逻辑简单直观。
- 方案2借助专业库,能处理更复杂的字段内换行场景,输出的CSV格式完全符合规范。
- 处理大量文件前,建议先备份原文件,避免数据丢失。
内容的提问来源于stack exchange,提问作者Jaime R
相关产品推荐
相关产品推荐

