簡體   English   中英

Python 忽略並跳過錯誤行,繼續下一行

[英]Python ignore and skip error line, and continue with the next line

我試過的:

import simplejson
import pandas as pd
with open('/tmp/test.json') as f:
    try:
        data = pd.DataFrame(simplejson.loads(line) for line in f)
    except Exception as e:
        pass
data.to_csv('/tmp/data.csv')

然后我收到錯誤消息:

NameError: name 'data' is not defined.  

我應該怎么做才能解決這個問題?

這意味着您成功地捕獲了錯誤並進入了except語句中的條件,因此您的數據永遠不會被加載並且變量data永遠不會被定義。 然后當您嘗試將數據保存到 csv 時,會觸發錯誤。

您應該做的是將您的to_csv語句也放入try-except中:

import simplejson
import pandas as pd
with open('/tmp/test.json') as f:
    try:
        data = pd.DataFrame(simplejson.loads(line) for line in f)
        data.to_csv('/tmp/data.csv')
    except Exception as e:
        pass

此外,在 Python 中, except Exception as e: pass ,這是一個可怕的反模式。 這將導致代碼幾乎無法調試,因為您正在捕獲可能發生的每一個錯誤,而不是您期望發生的錯誤。 當您這樣做時,您應該記錄完整的錯誤堆棧或將其打印到控制台以了解您正在捕獲的確切錯誤:

    try:
        data = pd.DataFrame(simplejson.loads(line) for line in f)
    except Exception as e:
        err = str(e)
        print(err)        

或者您應該捕捉到您希望在這里發生的特定錯誤:

    try:
        data = pd.DataFrame(simplejson.loads(line) for line in f)
    except FileNotFoundError:
        pass

為了更好地解釋,這里你的程序是如何在內部運行的,

內部嘗試塊:

  1. 首先 pd.Dataframe 被實例化

    some_memory_loc STORES pd.DataFrame(simplejson.loads(line) for line in f)

  2. 然后data變量保存 memory 地址和類型為 DataFrame:

    data = some_memory_loc AND TYPE(data) = pd.DataFrame

  3. 然后程序移出try catch塊

現在,在您的案例中實際發生的是,在第一步中,程序會生成一個異常。 因此直接運行到 except 塊。 所以第二步從未執行。 因此,您的 python 程序不知道什么是data

我希望你已經理解,因此可以自己解決。

data.to_csv("/tmp/data.csv")放在try語句中,或者在except語句中添加代碼以在數據行上拋出異常時以其他方式創建數據 object(並且它不會創建數據對象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM