【问题标题】:How to continue a loop after catching exception in try ... except在try中捕获异常后如何继续循环...除了
【发布时间】:2019-02-21 04:38:49
【问题描述】:

我正在分块读取一个大文件,并且我正在对每个块执行一些操作。在阅读其中一个获取它们时,我收到以下消息错误:

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 时找不到任何类似的东西。任何帮助将不胜感激。

更新:

我已尝试按照 cmets 中的建议进行操作:

try:
    for chunk in data:
        #operations
except pandas.errors.ParserError:
        # continue/pass/handle error

但仍然没有捕获异常,因为如上所述,异常是在从我的数据中获取 chyunk 时创建的,而不是在对其进行操作时创建的。

【问题讨论】:

  • 如果您跳过异常处理并传递error_bad_lines=True 会发生什么 - 这是否会挽救足够多的行来使用?因为你有sep=',' - 你确定你不应该在这里使用pd.read_csv,以防问题是你在列中嵌入了引号?
  • 我确实在列中嵌入了引号。 error_bad_lines = True 应该作为 pd.read_csv 的参数?
  • 对不起,我的意思是在引用的列中嵌入逗号,但是是的 - 可能值得一试,看看它是否有帮助。
  • 它仍然给出 panda.erros.ParserError
  • 对不起使用 False - 不是 True...

标签: python python-3.x pandas for-loop try-except


【解决方案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)

【讨论】:

  • 问题是我得到了异常 in 循环,而不是循环内。
  • 哦,像for chunk in data 本身就是故障线?不是# operations的内容?
【解决方案2】:

我了解到,在操作部分您会遇到异常。如果是这样:你应该继续:

for chunk in data:
    try:
       # operations
    except pandas.errors.ParseError:
       # continue

【讨论】:

  • 我在读取块时遇到异常。如果我尝试在 for 循环之后调试我的代码,代码甚至没有进入那里,因为问题出在 for 循环中,而不是在完成的操作中。
  • @Marisa:如果获取块时发生错误,您将无法继续循环到下一个。
  • 甚至没有下一个块?只是省略那个?
  • @Marisa:如果有错误怎么会这样?
  • 因为第 i 个块会出错,但第 (i+1) 个块不会出错。
【解决方案3】:

我不确定异常是在哪里引发的。也许添加一个完整的错误堆栈会有所帮助。如果错误是由 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

【讨论】:

    【解决方案4】:

    正如@JonClements 所建议的那样,解决我的问题的方法是在pd.read_csv 中使用error_bad_lines=False,所以它只是跳过了导致麻烦的行,让我执行for 循环的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 2020-07-01
      • 2011-02-07
      • 2022-01-26
      • 2015-08-19
      • 2018-03-20
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多