You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:13:04