设置error_bad_lines=False后pandas.read_csv仍因坏行报错如何解决
问题原因
你的代码报错主要有两个核心原因:
- 全局指定
dtype='float64'和parse_dates=['TimeStamp']冲突:TimeStamp列需要解析为日期格式,你强制要求所有列转float64本身就会触发类型转换异常。 - 异常行列数和表头完全匹配,
error_bad_lines=False(该参数已在pandas 1.3+版本弃用,替代为on_bad_lines='skip')不会生效:该参数只会跳过列数和表头不一致的行,你的异常行只是最后一列值为字符串,列数完全符合要求,所以不会被自动跳过,最终触发字符串转float的报错。
最优解决方案(无额外内存开销、无需修改源文件)
你可以通过包装文件流的方式,在pandas读取前就过滤掉异常行,异常行根本不会进入pandas的解析流程,完全不会产生额外内存开销。示例代码如下:
import pandas as pd def filter_valid_lines(file_path): with open(file_path, 'r', encoding='utf-8') as f: for line in f: # 只返回不包含异常标记的行 if '/muse/elements/blink' not in line: yield line # 先读取表头构造类型字典,仅给数值列指定float64,避免和日期解析冲突 cols = pd.read_csv(mypath, nrows=0).columns.tolist() dtype_map = {col: 'float64' for col in cols if col != 'TimeStamp'} # 直接传入过滤后的行生成器 df = pd.read_csv( filter_valid_lines(mypath), dtype=dtype_map, parse_dates=['TimeStamp'] )
替代简化方案
如果确认所有正常行中不会出现/字符,也可以用comment参数快速实现:
import pandas as pd cols = pd.read_csv(mypath, nrows=0).columns.tolist() dtype_map = {col: 'float64' for col in cols if col != 'TimeStamp'} numeric_cols = [col for col in cols if col != 'TimeStamp'] df = pd.read_csv( mypath, dtype=dtype_map, parse_dates=['TimeStamp'], comment='/', # 遇到/就截断后面的内容,异常行的字符串会被直接忽略 ).dropna(axis=0, how='all', subset=numeric_cols) # 删掉被截断后数值列全为空的异常行
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

