2017-08-04 14 views
0

有點背景 - 我有一個Python程序可以從CSV文件中繪製圖表。我試圖通過允許用戶輸入1到3個文件來使它更加靈活。我將csv數據導入到熊貓數據框中,然後用它們生成許多不同的圖。我確信有更好的方式來做我正在做的事情,但在我最初嘗試弄清楚用戶是否輸入了小於最大數目的情況下,我遇到了一些奇怪的事情(對我來說,至少)的文件。爲什麼我無法在Python中的block中同時捕獲NameError和UnboundLocalError?

這是我如何導入數據:

# Imports the data. The first two rows must be skipped due to the file format 
data1 = pd.read_csv(filename1, skiprows=1, header=True) 
if filename2 != '': 
    data2 = pd.read_csv(filename2, skiprows=1, header=True) 
if filename3 != '': 
    data3 = pd.read_csv(filename3, skiprows=1, header=True) 

所以data2data3如果用戶已經從我的GUI提供的文件名只定義。後來,我只是想用的data2data3的存在,以確定是否要分別繪製第二和第三個數據集:

try: 
     axarr[1, 0].psd(data1[Ynew], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName1) 
    except KeyError: 
     axarr[1, 0].psd(data1[Yold], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName1) 
    try: 
     axarr[1, 0].psd(data2[Ynew], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName2) 
    except (UnboundLocalError, NameError): 
     pass 
    except KeyError: 
     axarr[1, 0].psd(data2[Yold], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName2) 
    try: 
     axarr[1, 0].psd(data3[Ynew], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName3) 
    except (UnboundLocalError, NameError): 
     pass 
    except KeyError: 
     axarr[1, 0].psd(data3[Yold], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName3) 

這裏的地方就變得奇怪。當我運行這個東西時,它會拋出一個UnboundLocalError,告訴我'NameError'在賦值之前被引用。所以,除了應該捕獲UnboundLocalError的塊之外沒有像我期望的那樣傳遞。如果我試圖捕獲UnboundLocalError,則會引發NameError。如果我試圖捕獲一個NameError,則會引發UnboundLocalError。有人可以向我解釋發生了什麼事嗎?

編輯 - 這裏的回溯:

Error Traceback

+2

請包括一個完整的堆棧跟蹤。 – DyZ

+0

這是Python 2還是Python 3? – jwodder

+0

試圖將其歸結爲一個獨立的例子也是有用的。首先,這使得更容易關注實際問題。另一方面,它經常揭示一個潛在的原因。我懷疑這一次,引用'NameError'不應該拋出任何異常。 –

回答

0

我重新審視這個多次,似乎有對這類問題漂浮在那裏錯誤報告。無論如何,異常是相對昂貴的操作。您可以使用類似下面的內容來規避您的問題並減少週期。

data1 = None 
data2 = None 
data3 = None 
if filename1 != '': 
    data1 = ... 
if filename2 != '': 
    data2 = ... 
if filename3 != '': 
    data3 = ... 

if data1 is not None: 
    if Ynew in data1: 
     axarr[1,0].psd(data1[Ynew] ... 
    elif Yold in data1: 
     axarr[1,0].psd(data1[Yold] ... 
if data2 is not None: 
    if Ynew in data2: 
     axarr[1,0].psd(data2[Ynew] ... 
    elif Yold in data2: 
     axarr[1,0].psd(data2[Yold] ... 
if data3 is not None: 
    if Ynew in data3: 
     axarr[1,0].psd(data3[Ynew] ... 
    elif Yold in data3: 
     axarr[1,0].psd(data3[Yold] ... 
相關問題