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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:55:28