2017-08-04 54 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] ... 
相关问题