Pandas读取TSV文件触发ValueError,如何忽略异常行?
解决Pandas读取IMDB制表符分隔文件时的异常行忽略问题
问题根源
你遇到的ValueError: Unable to parse string 'Reality-TV'异常,是因为部分行的列被双引号包裹,而你提前指定了该列的数据类型(比如数值型),Pandas无法将带引号的字符串解析为对应类型导致的。
无需预处理文件的解决方法
直接在read_csv(制表符分隔用sep='\t')中添加参数跳过解析错误的行,分两种场景:
1. Pandas 1.3.0及以上版本(推荐)
使用on_bad_lines参数,设置为'skip'直接跳过异常行:
import pandas as pd # 分块读取示例代码 chunker = pd.read_csv( "imdb_dataset.tsv", sep="\t", usecols=["你指定的列名1", "列名2"], # 替换为你的目标列 dtype={"列名1": str, "列名2": int}, # 替换为你的指定类型 na_values=["NA", ""], chunksize=1000, on_bad_lines="skip" # 关键参数:跳过解析失败的行 ) # 遍历处理每个分块 for chunk in chunker: # 这里写你的分块处理逻辑 print(chunk.shape)
如果需要查看被跳过的行信息,可将on_bad_lines设为'warn',会打印警告日志但不中断程序。
2. Pandas 1.3.0以下版本
用error_bad_lines=False替代(该参数已被官方标记为过时,但旧版本仍可用):
chunker = pd.read_csv( "imdb_dataset.tsv", sep="\t", usecols=["你指定的列名1", "列名2"], dtype={"列名1": str, "列名2": int}, na_values=["NA", ""], chunksize=1000, error_bad_lines=False )
补充说明
如果不想跳过行,也可以先不指定dtype,读取后再对目标列做类型转换和异常值处理,但这种方法需要额外的清洗步骤,不如直接跳过异常行高效。
内容的提问来源于stack exchange,提问作者stelios
相关产品推荐
相关产品推荐

