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删除太长/不好的行?
答案 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文件。