【发布时间】:2017-08-04 18:38:39
【问题描述】:
一点背景知识——我有一个 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)
所以 data2 和 data3 仅在用户从我的 GUI 提供文件名时才定义。后来我只想利用data2和data3的存在来判断是否分别绘制2nd和3rd数据集:
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 的 except 块不会像我预期的那样通过。如果我尝试仅捕获 UnboundLocalError,则会引发 NameError。如果我尝试仅捕获 NameError,则会引发 UnboundLocalError。有人可以向我解释这里发生了什么吗?
编辑-这是回溯:
【问题讨论】:
-
请包含完整的堆栈跟踪。
-
这是 Python 2 还是 Python 3?
-
尝试将其归结为一个独立的示例也很有用。一方面,这使得更容易专注于实际问题。另一方面,它经常揭示一个根本原因。我怀疑这次会,引用
NameError不应该抛出任何异常。 -
@jwodder -- Python 2.7
-
很可能,你不小心在某处写了
except UnboundLocalError, NameError,没有括号,创建了一个名为NameError的局部变量。
标签: python error-handling