我正在逐块读取一个大文件,并且正在对每个块进行一些操作。读取其中之一时,出现以下消息错误:
pandas.errors.ParserError:标记数据时出错。 C错误:在15929977行中预期有26个字段,看到了118
这意味着我的文件行之一与其他文件行没有采用相同的格式。我以为我可以做的就是忽略这一部分,但是我没有办法做到。我尝试做一个try/except
块,如下所示:
data = pd.read_table('ny_data_file.txt', sep=',',
header=0, encoding = 'latin1', chunksize = 5000)
try:
for chunk in data:
# operations
except pandas.errors.ParseError:
# Here is my problem
我在这里写的是我的问题是,如果块分析得不好,我的代码将自动进入异常,甚至不进入for循环,但是我想要的是跳过这一块,然后前进到下一个,我要在其上执行循环内的操作。
我检查了stackoverflow,但是在for循环上进行尝试的地方找不到类似的东西。任何帮助将不胜感激。
更新:
我已尝试按照评论中的建议进行操作:
try:
for chunk in data:
#operations
except pandas.errors.ParserError:
# continue/pass/handle error
但是仍然不能捕获异常,因为如上所述,该异常是在从我的数据中获取chyunk而不是对其进行操作时创建的。
答案 0 :(得分:1)
我了解到,在操作部分您会获得例外。如果是这样:您应该继续:
for chunk in data:
try:
# operations
except pandas.errors.ParseError:
# continue
答案 1 :(得分:1)
使用try - except
的方式会使它在捕获到异常的情况下跳过整个for循环。如果只想跳过一个迭代,则需要在循环内编写try-except,如下所示:
for chunk in data:
try:
# operations
except pandas.errors.ParseError as e:
# inform the user of the error
print("Error encountered while parsing chunk {}".format(chunk))
print(e)
答案 2 :(得分:1)
我不确定在哪里引发异常。也许添加一个完整的错误堆栈会有所帮助。如果该错误是由read_table()调用引发的,则可以尝试以下操作:
try:
data = pd.read_table('ny_data_file.txt', sep=',',
header=0, encoding = 'latin1', chunksize = 5000)
except pandas.errors.ParseError:
pass
for chunk in data:
# operations
答案 3 :(得分:0)
@JonClements的建议解决了我的问题,就是在error_bad_lines=False
中使用pd.read_csv
,因此它跳过了引起麻烦的行,并让我执行了其余的for循环。