如何在读取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
相关产品推荐
相关产品推荐

