使用Python移除并重新排序含随机换行的CSV文件
解决CSV文件随机换行的Python方案
我之前也碰到过这种数据库导出CSV时的换行bug,简直头疼!你的情况很明确:每条完整记录的第一列都是以NA开头的,那些零散的换行其实是同一条记录被错误拆成了多行。用Python处理的话,核心思路就是把那些不以NA开头的行合并到它所属的上一行记录里,下面给你两种实用的方法:
方法一:先整理成标准文本再保存
这种方法适合先把文件修复成标准CSV格式,之后再正常读取处理,逻辑直观易懂:
# 替换成你的输入输出文件路径 input_path = "messy_data.csv" output_path = "cleaned_data.csv" # 读取所有行 with open(input_path, 'r', encoding='utf-8') as infile: raw_lines = infile.readlines() cleaned_records = [] current_record = "" for line in raw_lines: trimmed_line = line.strip() # 跳过空行 if not trimmed_line: continue # 判断是否是新记录的开头(以NA起始) if trimmed_line.startswith('NA'): # 如果之前有未完成的记录,先存入列表 if current_record: cleaned_records.append(current_record) # 开始拼接新记录 current_record = trimmed_line else: # 把拆分出来的列内容合并到当前记录(去掉开头多余的逗号) current_record += ',' + trimmed_line.lstrip(',') # 别忘了把最后一条记录加进去 if current_record: cleaned_records.append(current_record) # 写入修复后的文件 with open(output_path, 'w', encoding='utf-8', newline='') as outfile: # 先写入表头(假设原始文件第一行是表头) outfile.write(raw_lines[0]) # 写入所有修复后的记录行 for record in cleaned_records: outfile.write(record + '\n')
方法二:用CSV模块直接处理
如果想一步到位,直接用Python的csv模块动态判断并写入,适合需要后续直接处理数据的场景:
import csv input_path = "messy_data.csv" output_path = "cleaned_data.csv" with open(input_path, 'r', encoding='utf-8') as infile, \ open(output_path, 'w', encoding='utf-8', newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 先写入表头 header = next(reader) writer.writerow(header) current_record = [] for row in reader: # 清理当前行的空内容 cleaned_row = [item.strip() for item in row if item.strip()] if not cleaned_row: continue # 识别新记录:第一个非空内容以NA开头 if cleaned_row[0].startswith('NA'): # 写入上一条未完成的记录 if current_record: writer.writerow(current_record) # 初始化新记录 current_record = cleaned_row.copy() else: # 把拆分的列追加到当前记录 current_record.extend(cleaned_row) # 处理最后一条记录 if current_record: writer.writerow(current_record)
一些注意点
- 编码适配:如果你的CSV是GBK等其他编码,记得把
encoding='utf-8'改成对应的编码格式,避免乱码。 - 小样本测试:先拿一小部分数据跑一遍,确认合并逻辑没问题,比如有没有多余的逗号或者遗漏的字段。
- 空行过滤:代码里已经处理了空行,如果你的文件有大量空行,这个逻辑会自动跳过。
内容的提问来源于stack exchange,提问作者MartJohn
相关产品推荐
相关产品推荐

