有一点背景-我有一个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提供文件名时,才定义
data2
和data3
。后来,我只是想利用data2
和data3
的存在来确定是否分别绘制第二和第三数据集: 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] ...