有一点背景-我有一个Python程序,可以从CSV文件进行绘图。我试图通过允许用户输入1到3个文件来使其更加灵活。我将csv数据导入到pandas数据框中,然后使用它们生成许多不同的图。

我敢肯定,有一种更好的方式来做我正在做的事情,但是在我最初试图弄清楚用户输入的文件数是否少于最大数量时,遇到了一件奇怪的事情(至少对我来说)。

这是我导入数据的方式:

# 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)

因此,仅当用户从我的GUI提供文件名时,才定义data2data3。后来,我只是想利用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

最佳答案

我已经多次重访,似乎有关于此类问题的错误报告。无论如何,异常(exception)是相对昂贵的操作。您可以使用以下类似方法来规避问题并减少周期。

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] ...

07-24 15:43