尝试在 while 循环中排除 python
try and except in while-loop python
我正在处理传入数据的实时图。数据来自频谱分析仪,有时我会得到错误的数据。错误的意思是在某些位置上有字母而不是数字。
我将传入的数据保存为列表,然后将其转换为 numpy.array
和
trace = np.array(trace, np.float)
因此,当其中一个条目中有字母而不是数字时,会引发 ValueError
并且程序被取消并且不再绘制。
所以我考虑在 while-loop
中使用 try and except
。
但这里出现了问题:情节看起来不再像它应该的那样。
我的想法是,如果数据有误,实时绘图根本不应该绘制数据而只是跳过绘图。数据错误的部分保持白色或不更新。
这就是情节通常应该是这样的:
我希望你明白了...每条新数据都会绘制下一个十六分之一的圆圈。
但是 try and except
看起来像这样:
并且只更新负y轴上的部分。
哦,我忘了说 while-loop
没有中断条件。
也许我对 try and except
的工作方式有错误的认识。但我希望你能帮助我。
代码while-loop
while True :
try:
trace = inst.query(':TRACe:DATA? TRACE1').partition(' ')[2][:-2].split(', ')# the first & last 2 entries are cut off, are random numbers
f = open(timestamp,'a') # open file
for value in trace : #write to file
f.write(value)
f.write('\n')
zeroarray = np.zeros(200) #change the length of zeroarray to gain a bigger circle in the middle
trace = np.array(trace, np.float)
indexmax = np.argsort(trace) #gives us the index array of the sorted vector maximum
maximum = np.sort(trace) #sorts the array with the values
print 'The four maxima are' # prints the four biggest values
for i in range(-1,-5,-1):
if indexmax[i] == 0 :
frequency = start
elif indexmax[i] == 600 :
frequency = stop
else :
frequency = ( indexmax[i] + 1 ) * (start -stop)/601
print maximum[i], 'dB at', frequency ,' Hz '
print '\n'
trace = np.insert(trace,0,zeroarray)
a = np.linspace(i*np.pi/8+np.pi/16-np.pi/8, i*np.pi/8+np.pi/16, 2)#Angle, circle is divided into 16 pieces
b = np.linspace(start -scaleplot, stop,801) #points of the frequency + 200 more points to gain the inner circle
A, B = np.meshgrid(a, trace)
#actual plotting
ax = plt.subplot(111, polar=True)
ctf = ax.contourf(a, b, B, cmap=cm.jet)
xCooPoint = i*np.pi/8 + np.pi/16 #shows the user the position of the plot
yCooPoint = stop
ax.plot(xCooPoint, yCooPoint, 'or', markersize = 15)
xCooWhitePoint = (i-1) * np.pi/8 + np.pi/16 #this erases the old red points
yCooWhitePoint = stop
ax.plot(xCooWhitePoint, yCooWhitePoint, 'ow', markersize = 15)
plt.draw()
except ValueError :
print('Some data was wrong')
i+=1
感谢您的快速帮助!
我建议只在 try/except
子句中放入您希望引发异常的内容。代码会更清晰,并且您可以确定异常是由您期望引发的引发的。类似于:
try:
trace = np.array(trace, np.float)
except ValueError:
print('Some data was wrong')
i += 1
continue
#remaining code...
更多评论:
- 每次迭代都需要打开de文件吗?你不应该也关闭它吗?
- 是否需要在每次迭代时创建子图?
- 您在
range
中和 except
末尾使用了 i
变量。你不应该使用不同的变量名吗?您确定 i
只有在出现异常时才需要增加吗?
我正在处理传入数据的实时图。数据来自频谱分析仪,有时我会得到错误的数据。错误的意思是在某些位置上有字母而不是数字。
我将传入的数据保存为列表,然后将其转换为 numpy.array
和
trace = np.array(trace, np.float)
因此,当其中一个条目中有字母而不是数字时,会引发 ValueError
并且程序被取消并且不再绘制。
所以我考虑在 while-loop
中使用 try and except
。
但这里出现了问题:情节看起来不再像它应该的那样。
我的想法是,如果数据有误,实时绘图根本不应该绘制数据而只是跳过绘图。数据错误的部分保持白色或不更新。
这就是情节通常应该是这样的:
我希望你明白了...每条新数据都会绘制下一个十六分之一的圆圈。
但是 try and except
看起来像这样:
并且只更新负y轴上的部分。
哦,我忘了说 while-loop
没有中断条件。
也许我对 try and except
的工作方式有错误的认识。但我希望你能帮助我。
代码while-loop
while True :
try:
trace = inst.query(':TRACe:DATA? TRACE1').partition(' ')[2][:-2].split(', ')# the first & last 2 entries are cut off, are random numbers
f = open(timestamp,'a') # open file
for value in trace : #write to file
f.write(value)
f.write('\n')
zeroarray = np.zeros(200) #change the length of zeroarray to gain a bigger circle in the middle
trace = np.array(trace, np.float)
indexmax = np.argsort(trace) #gives us the index array of the sorted vector maximum
maximum = np.sort(trace) #sorts the array with the values
print 'The four maxima are' # prints the four biggest values
for i in range(-1,-5,-1):
if indexmax[i] == 0 :
frequency = start
elif indexmax[i] == 600 :
frequency = stop
else :
frequency = ( indexmax[i] + 1 ) * (start -stop)/601
print maximum[i], 'dB at', frequency ,' Hz '
print '\n'
trace = np.insert(trace,0,zeroarray)
a = np.linspace(i*np.pi/8+np.pi/16-np.pi/8, i*np.pi/8+np.pi/16, 2)#Angle, circle is divided into 16 pieces
b = np.linspace(start -scaleplot, stop,801) #points of the frequency + 200 more points to gain the inner circle
A, B = np.meshgrid(a, trace)
#actual plotting
ax = plt.subplot(111, polar=True)
ctf = ax.contourf(a, b, B, cmap=cm.jet)
xCooPoint = i*np.pi/8 + np.pi/16 #shows the user the position of the plot
yCooPoint = stop
ax.plot(xCooPoint, yCooPoint, 'or', markersize = 15)
xCooWhitePoint = (i-1) * np.pi/8 + np.pi/16 #this erases the old red points
yCooWhitePoint = stop
ax.plot(xCooWhitePoint, yCooWhitePoint, 'ow', markersize = 15)
plt.draw()
except ValueError :
print('Some data was wrong')
i+=1
感谢您的快速帮助!
我建议只在 try/except
子句中放入您希望引发异常的内容。代码会更清晰,并且您可以确定异常是由您期望引发的引发的。类似于:
try:
trace = np.array(trace, np.float)
except ValueError:
print('Some data was wrong')
i += 1
continue
#remaining code...
更多评论:
- 每次迭代都需要打开de文件吗?你不应该也关闭它吗?
- 是否需要在每次迭代时创建子图?
- 您在
range
中和except
末尾使用了i
变量。你不应该使用不同的变量名吗?您确定i
只有在出现异常时才需要增加吗?