指定名称时,Pandas read_csv不会因行错误而引发异常

时间:2018-06-26 19:01:38

标签: python pandas

当遇到行数过多的行时,

pandas read_csv 引发异常( error_bad_lines )。但是,如果指定参数 names ,则不会发生这种情况。

示例csv文件,其格式为:

1, 2, 3
1, 2, 3
1, 2, 3, 4
使用pd.read_csv(filepath,header = None)进行

read会正确引发 ParserError:标记数据出错。 C错误:第3行中预期有3个字段,由于增加了列,因此看到了4

但是,当将“名称”指定为参数时:

>>> pd.read_csv(filepath, names=['A', 'B', 'C'], header=None)
   A  B  C
0  1  2  3
1  1  2  3
2  1  2  3

没有引发错误,并且包括应跳过的“太长/不好”行...

有没有一种方法可以指定名称,并且仍然引发ParserError,从而可以使用error_bad_lines = False删除太长/不好的行?

2 个答案:

答案 0 :(得分:1)

似乎没有整齐的熊猫解决方案。您可以做的是使用python的open()加载CSV文件,然后向文件字符串中添加新的标头,这样就不会修改磁盘上的原始文件。之后,您可以使用带有熊猫的StringIO加载文件字符串。这样可以保留错误:

#python3
from io import StringIO
import pandas as pd
lines = open('./test.csv', 'r').readlines()
lines = ['A, B, C'] + lines
fileString = '\n'.join(lines)
df = pd.read_csv(StringIO(fileString), sep=",")

答案 1 :(得分:0)

根据您的输入示例进行有根据的猜测:您遇到的行为可能是由于您隐式告诉pd.read_csv设置len(usecols) = len(names)所致。因此,导致您的初始异常的列将不会被导入。

当您在csv文件中有列时,向names添加尽可能多的标头名称时,您将获得初始异常:

# 1. Determine maximum column count
    sep = ','                                                   # Define separator
    lines = open(filepath).readlines()                        # Open file and read lines
    colcount = max([len(l.strip().split(sep)) for l in lines])  # Count separator

# 2. Add column headers
    df = pd.read_csv(filepath, names = range(colcount))
    # you can rename your columns of interest here in case of error_bad_lines = False

现在,将包含缺少值的列,并且您的异常将再次出现。请注意,这种计算最大列数的方法仅适用于.csv文件。