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

如何用Python Pandas修复CSV中1124/1125行的拆分异常?

错误日志翻译:
google.api_core.exceptions.BadRequest: 400 读取数据时出错,错误信息:CSV处理遇到过多错误,已终止。
行数:60431;错误数:82;最大允许错误数:0;错误百分比:0;原因:无效,信息:CSV处理遇到过多错误,已终止。
行数:60431;错误数:82;最大允许错误数:0;错误百分比:0;原因:无效,位置:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv,信息:
**读取数据时出错,错误信息:缺少闭合引号(")。;
行号:1124 行起始字节偏移:80843 列索引:3 列名:"description" 列类型:STRING 值:"Broccoli, steamed..." 文件:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv;
原因:无效,位置:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv,信息:读取数据时出错,错误信息:缺少闭合引号(")。;
行号:1125 行起始字节偏移:80929 列索引:0 列名:"string_field_0" 列类型:STRING 值:",11.0,2019-04-01" 文件:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv;
原因:无效,位置:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv,信息:读取数据时出错,错误信息:无法解析输入字符串"7/19/2023";
行号:55227 行起始字节偏移:4634498 列索引:5 列名:"publication_date" 列类型:DATE 值:"7/19/2023" 文件:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv;
原因:无效,位置:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv,信息:读取数据时出错,错误信息:无法解析输入字符串"7/19/2023";
行号:55233 行起始字节偏移:4634875 列索引:5 列名:"publication_date" 列类型:DATE 值:"7/19/2023" 文件:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv;
原因:无效,位置:gs://openfoodfacts_objectstorage/data/FoodData_Central_foundation_food_csv_2023-10-26/food.csv

解决CSV行异常分离及解析错误的Python方案

一、核心问题分析

从日志可明确两个关键问题:

  1. 第1124行description字段缺少闭合引号,导致后续内容被错误拆分为第1125行,属于行异常分离
  2. 部分publication_date字段格式为MM/DD/YYYY,与目标DATE类型不匹配

二、针对1124/1125行的修复步骤

方法1:逐行读取合并异常行

适合明确知道异常行号的场景,直接操作文本文件合并行并修复引号:

input_path = "food.csv"
output_path = "fixed_food.csv"

with open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', encoding='utf-8') as outfile:
    lines = infile.readlines()
    for i, line in enumerate(lines, 1):
        # 合并1124和1125行,补上缺失的闭合引号
        if i == 1124:
            fixed_line = line.rstrip('\n') + lines[1124].rstrip('\n') + '"' + '\n'
            outfile.write(fixed_line)
        # 跳过原1125行(已合并)
        elif i == 1125:
            continue
        # 其他行直接写入
        else:
            outfile.write(line)

方法2:Pandas容错读取+修复

先处理文本行再转DataFrame,同时解决日期解析问题:

import pandas as pd

# 读取所有行
with open("food.csv", 'r', encoding='utf-8') as f:
    lines = f.readlines()

# 修复1124/1125行
if len(lines) >= 1125:
    lines[1123] = lines[1123].rstrip('\n') + lines[1124].rstrip('\n') + '"' + '\n'
    del lines[1124]

# 写入临时文件后用Pandas读取
with open("temp_fixed.csv", 'w', encoding='utf-8') as f:
    f.writelines(lines)

# 指定日期格式解析,处理日期错误
df = pd.read_csv(
    "temp_fixed.csv",
    parse_dates=['publication_date'],
    date_format='%m/%d/%Y'
)

# 验证修复结果
print(df.loc[1123])  # 原1124行,索引从0开始

三、批量处理类似行异常的通用思路

如果存在多处引号缺失导致的行拆分,可通过统计引号数量自动修复:

def fix_broken_lines(lines):
    fixed_lines = []
    current_line = ""
    for line in lines:
        current_line += line.rstrip('\n')
        # 偶数引号表示闭合,奇数表示未闭合需继续拼接
        if current_line.count('"') % 2 == 0:
            fixed_lines.append(current_line + '\n')
            current_line = ""
        else:
            continue
    # 处理最后一行未闭合的情况
    if current_line:
        fixed_lines.append(current_line + '"' + '\n')
    return fixed_lines

# 使用示例
with open("food.csv", 'r', encoding='utf-8') as f:
    lines = f.readlines()

fixed_lines = fix_broken_lines(lines)
with open("fixed_food.csv", 'w', encoding='utf-8') as f:
    f.writelines(fixed_lines)

四、额外建议

  • 修复后检查异常行的字段数量,确保与表头一致
  • 云存储CSV先下载到本地处理,再重新上传
  • 超大文件可分块读取,避免内存溢出

内容的提问来源于stack exchange,提问作者Gabe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:04:59