如何用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
一、核心问题分析
从日志可明确两个关键问题:
- 第1124行
description字段缺少闭合引号,导致后续内容被错误拆分为第1125行,属于行异常分离 - 部分
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

