如何在 try ... except 中捕获异常后继续循环
How to continue a loop after catching exception in try ... except
我正在分块读取一个大文件,并且正在对每个块执行一些操作。在阅读其中一个时,我收到以下消息错误:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 26 fields in line 15929977, saw 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
我这里写的是我的问题是,如果chunk没有解析好,我的代码会自动跳到异常甚至不进入for循环,但是什么我想跳过这个块并前进到下一个,我想在循环内执行操作。
我已经在 Whosebug 上进行了检查,但在 for 循环上执行 try 的地方找不到任何类似的东西。任何帮助将不胜感激。
更新:
我已尝试按照评论中的建议进行操作:
try:
for chunk in data:
#operations
except pandas.errors.ParserError:
# continue/pass/handle error
但仍然没有捕捉到异常,因为如前所述,异常是在从我的数据中获取 chyunk 时创建的,而不是在对其进行操作时创建的。
我了解到,在操作部分您会遇到异常。如果是这样:你应该继续:
for chunk in data:
try:
# operations
except pandas.errors.ParseError:
# continue
您使用 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)
我不确定哪里抛出异常。也许添加一个完整的错误堆栈会有所帮助。如果错误是由 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
正如@JonClements 所建议的那样,解决我的问题的方法是在 pd.read_csv
中使用 error_bad_lines=False
,因此它只是跳过了导致问题的行,让我执行 for 循环的其余部分。
我正在分块读取一个大文件,并且正在对每个块执行一些操作。在阅读其中一个时,我收到以下消息错误:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 26 fields in line 15929977, saw 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
我这里写的是我的问题是,如果chunk没有解析好,我的代码会自动跳到异常甚至不进入for循环,但是什么我想跳过这个块并前进到下一个,我想在循环内执行操作。
我已经在 Whosebug 上进行了检查,但在 for 循环上执行 try 的地方找不到任何类似的东西。任何帮助将不胜感激。
更新:
我已尝试按照评论中的建议进行操作:
try:
for chunk in data:
#operations
except pandas.errors.ParserError:
# continue/pass/handle error
但仍然没有捕捉到异常,因为如前所述,异常是在从我的数据中获取 chyunk 时创建的,而不是在对其进行操作时创建的。
我了解到,在操作部分您会遇到异常。如果是这样:你应该继续:
for chunk in data:
try:
# operations
except pandas.errors.ParseError:
# continue
您使用 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)
我不确定哪里抛出异常。也许添加一个完整的错误堆栈会有所帮助。如果错误是由 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
正如@JonClements 所建议的那样,解决我的问题的方法是在 pd.read_csv
中使用 error_bad_lines=False
,因此它只是跳过了导致问题的行,让我执行 for 循环的其余部分。