Optimization of code to avoid occasional error "ValueError: need more than 0 values to unpack"
Optimization of code to avoid occasional error "ValueError: need more than 0 values to unpack"
我有一个程序,它使用 telnet 连接连接到远程系统 (运行 Linux) 并运行二进制文件,打印一些值。我使用 read_very_eager()
将这些值检索到缓冲区并处理它们(基本上计算值的平均值)。以下是我的代码:
import telnetlib
import time
import string
lpr=[]
lpr_s=[]
lpr_val=[]
lpr_agg=[]
lpr_sum=0
tn1 = telnetlib.Telnet("192.168.1.101")
print tn1.read_until("login: ")
print tn1.write("root1\n")
time.sleep(1)
print tn1.read_until("Password:")
print tn1.write("\n")
print tn1.write("\n")
print tn1.read_until("root1@dvf99:~$")
print tn1.write("su\n")
print tn1.read_until("root@dvf99:/home/root1")
print tn1.write("\n")
time.sleep(10)
print tn1.write("<binary_name>\n")
time.sleep(5)
buf=tn1.read_very_eager()
print buf
time.sleep(10)
buf=tn1.read_very_eager()
print buf
lpr=buf.splitlines()[:10]
print "splitlines :\n"+str(lpr)
for line in lpr:
lpr_s.append([int(s) for s in line.split() if s.isdigit()])
print(lpr_s)
lpr_val,lpr_agg=zip(*lpr_s)
print(lpr_val)
print "\n"
print(lpr_agg)
for i in range(0,10):
lpr_sum+=lpr_val[i]
print(lpr_sum)
looper=lpr_sum/10
print "\nlooper="+str(looper)+"\n"
tn1.close()
大多数时候,我得到语句 print(lpr_s)
的输出,例如:
[[46129, 461537], [46168, 507705], [46141, 553846], [46162, 600008], [46159, 646167], [46154, 692321], [46167, 738488], [46176, 784664], [46166, 830830], [46180, 877010]]
但有时,我得到语句 print(lpr_s)
的输出,如:
[[], [46168, 1892467], [46157, 1938624], [46161, 1984785], [46178, 2030963], [46162, 2077125], [46166, 2123291], [46141, 2169432], [46172, 2215604], [46167, 2261771]]
因此我在 lpr_val,lpr_agg=zip(*lpr_s)
处收到错误 ValueError: need more than 0 values to unpack
。现在,挑战是我需要优化代码,但程序应该相同 - 休眠 5 秒,保留初始值,休眠 10 秒,收集 10 个值并取它们的平均值。我怀疑是 read_very_eager()
导致列表空白的罪魁祸首。
所以,我的问题是:
- 我是否应该考虑用我还不知道的更好的解决方案替换
read_very_eager()
?
- 我是否应该只让
read_very_eager()
存在并执行类似检查列表中的空值并仅将非空值复制到另一个列表的操作?在这种情况下,我正在处理嵌套列表(列表中的列表)。我如何完成这项工作?
您可以 运行 您的列表 lpr_s
到 filter
首先从中删除空列表:
lpr_s = filter(None, lpr_s)
(请注意,None
指定 filter
应删除所有 "falsey" 值,其中包括空列表)
为什么不直接跳过空条目?
for line in lpr:
res = [int(s) for s in line.split() if s.isdigit()]
if res:
lpr_s.append(res)
或者如果该行是空的(我想就是这样):
for line in lpr:
if not line:
continue
lpr_s.append([int(s) for s in line.split() if s.isdigit()])
我有一个程序,它使用 telnet 连接连接到远程系统 (运行 Linux) 并运行二进制文件,打印一些值。我使用 read_very_eager()
将这些值检索到缓冲区并处理它们(基本上计算值的平均值)。以下是我的代码:
import telnetlib
import time
import string
lpr=[]
lpr_s=[]
lpr_val=[]
lpr_agg=[]
lpr_sum=0
tn1 = telnetlib.Telnet("192.168.1.101")
print tn1.read_until("login: ")
print tn1.write("root1\n")
time.sleep(1)
print tn1.read_until("Password:")
print tn1.write("\n")
print tn1.write("\n")
print tn1.read_until("root1@dvf99:~$")
print tn1.write("su\n")
print tn1.read_until("root@dvf99:/home/root1")
print tn1.write("\n")
time.sleep(10)
print tn1.write("<binary_name>\n")
time.sleep(5)
buf=tn1.read_very_eager()
print buf
time.sleep(10)
buf=tn1.read_very_eager()
print buf
lpr=buf.splitlines()[:10]
print "splitlines :\n"+str(lpr)
for line in lpr:
lpr_s.append([int(s) for s in line.split() if s.isdigit()])
print(lpr_s)
lpr_val,lpr_agg=zip(*lpr_s)
print(lpr_val)
print "\n"
print(lpr_agg)
for i in range(0,10):
lpr_sum+=lpr_val[i]
print(lpr_sum)
looper=lpr_sum/10
print "\nlooper="+str(looper)+"\n"
tn1.close()
大多数时候,我得到语句 print(lpr_s)
的输出,例如:
[[46129, 461537], [46168, 507705], [46141, 553846], [46162, 600008], [46159, 646167], [46154, 692321], [46167, 738488], [46176, 784664], [46166, 830830], [46180, 877010]]
但有时,我得到语句 print(lpr_s)
的输出,如:
[[], [46168, 1892467], [46157, 1938624], [46161, 1984785], [46178, 2030963], [46162, 2077125], [46166, 2123291], [46141, 2169432], [46172, 2215604], [46167, 2261771]]
因此我在 lpr_val,lpr_agg=zip(*lpr_s)
处收到错误 ValueError: need more than 0 values to unpack
。现在,挑战是我需要优化代码,但程序应该相同 - 休眠 5 秒,保留初始值,休眠 10 秒,收集 10 个值并取它们的平均值。我怀疑是 read_very_eager()
导致列表空白的罪魁祸首。
所以,我的问题是:
- 我是否应该考虑用我还不知道的更好的解决方案替换
read_very_eager()
? - 我是否应该只让
read_very_eager()
存在并执行类似检查列表中的空值并仅将非空值复制到另一个列表的操作?在这种情况下,我正在处理嵌套列表(列表中的列表)。我如何完成这项工作?
您可以 运行 您的列表 lpr_s
到 filter
首先从中删除空列表:
lpr_s = filter(None, lpr_s)
(请注意,None
指定 filter
应删除所有 "falsey" 值,其中包括空列表)
为什么不直接跳过空条目?
for line in lpr:
res = [int(s) for s in line.split() if s.isdigit()]
if res:
lpr_s.append(res)
或者如果该行是空的(我想就是这样):
for line in lpr:
if not line:
continue
lpr_s.append([int(s) for s in line.split() if s.isdigit()])