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

如何在读取CSV转为DataFrame时跳过格式错误的行?

处理CSV格式错误行并转换为DataFrame

问题场景

你的CSV文件存在多种格式错误的行,无法直接通过常规方式转换为DataFrame:

  • 正常行示例:22.02.2023,13:42:01,0.4373,2.5729,687.3574(5列,日期、时间、三个浮点数格式合规)
  • 异常行示例:
    • 列数匹配但内容格式错误:0.0011, 12:42:01, 0.0021, 3.9782, 0.0001(第一列应为日期却成了数值)
    • 内容粘连导致列数异常:22.02.2023999,13:42:010.4373,2.5729,687.3574444(前两列内容粘连,实际列数不足5)

解决方案

1. 基础方案:使用on_bad_lines='skip'

如果错误主要是列数不匹配,直接用pandas自带的参数即可跳过这类行:

import pandas as pd

# 跳过列数不匹配的错误行
df = pd.read_csv('your_file.csv', on_bad_lines='skip')

但这个方法有局限性:仅能识别列数不一致的行,对于列数匹配但内容格式错误(比如日期格式不对)的行,会被读入但后续处理可能报错。

2. 进阶方案:自定义行验证函数

针对多样的格式错误,编写自定义函数验证每行的格式合规性,精准跳过所有不符合要求的行:

import pandas as pd
import re

def validate_line(line):
    # 分割行内容并去除各字段的空格
    parts = [field.strip() for field in line.split(',')]
    # 第一步:检查列数是否为5
    if len(parts) != 5:
        return False
    date_str, time_str, num1, num2, num3 = parts
    # 验证日期格式是否为DD.MM.YYYY
    if not re.match(r'^\d{2}\.\d{2}\.\d{4}$', date_str):
        return False
    # 验证时间格式是否为HH:MM:SS
    if not re.match(r'^\d{2}:\d{2}:\d{2}$', time_str):
        return False
    # 验证三个数值是否为有效浮点数
    try:
        float(num1)
        float(num2)
        float(num3)
    except ValueError:
        return False
    # 所有验证通过则保留该行
    return True

# 传入自定义函数,跳过验证失败的行
df = pd.read_csv(
    'your_file.csv',
    on_bad_lines=lambda x: None if not validate_line(x) else x
)

你可以根据实际的格式要求调整验证规则,比如如果日期有其他合法格式、数值允许整数等,修改对应的正则或判断逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:25:29