我正在编写脚本,我需要这样做:
for ip, location, zone, dns in data:
但是我收到了这个错误:
ValueError: need more than 3 values to unpack
data
以这种方式构建:
def loadfile():
nativeFile = open("Zonechilds.csv","r")
newLine=" "
data=[]
while newLine!="":
newLine=nativeFile.readline()
if len(newLine)>0:
if newLine[len(newLine)-1]=="\n":
newLine=newLine[0:len(newLine)-1]
data.append(tuple(newLine.split(";")))
ultimo = data.pop()
return data
csv文件的一小部分示例:
200.35.126.30;dnscan01.mnc0004.mcc02de.gprs;View_Blackberry;DNSCAN01
0.0.0.0;lac.rac.prueba;View_Blackberry;DNSCAN01
200.35.126.29;dnscan02.mnc0004.mcc02de.gprs;View_Blackberry;DNSCAN01
127.0.0.1;localhost.mnc0004.mcc02de.gprs;View_Blackberry;DNSCAN01
当我这样做时:
for i in data:
print len(i)
我只得到4,我可以假设我的列表数据的任何位置都是4个成员列表。
我不明白为什么它告诉我它需要超过3名成员,当我给它4时。
此代码发生了什么?
答案 0 :(得分:4)
如果数据的所有成员都是4个成员的元组或4个成员的列表,并且您在for循环期间没有修改数据中的任何后续列表,那么我很确定您没有可能的方法从数据中解压缩元素时可能会出现此异常。
我可以看到两个最可能的解释:
1)你误解了引发异常的地方。它发生在你的for循环中的某个地方,而不是在分配ip,location,zone和dns时。检查堆栈跟踪并确保行号与for循环的顶部匹配。
2)数据中有一个偷偷摸摸的3人元组或列表。你真的,真的确定不是这样吗?是否所有([len(i)= = 4 for i in data])都是真的吗?
答案 1 :(得分:4)
除此之外:这是在Python中读取csv数据的错误方法 - 请改用csv
模块。您的整个代码就像:
import csv
with open("zonechilds.csv", "rb") as fp:
reader = csv.reader(fp, delimiter=";")
data = [tuple(line) for line in reader]
产生
>>> for ip, location, zone, dns in data:
... print ip, location, zone, dns
...
200.35.126.30 dnscan01.mnc0004.mcc02de.gprs View_Blackberry DNSCAN01
0.0.0.0 lac.rac.prueba View_Blackberry DNSCAN01
200.35.126.29 dnscan02.mnc0004.mcc02de.gprs View_Blackberry DNSCAN01
127.0.0.1 localhost.mnc0004.mcc02de.gprs View_Blackberry DNSCAN01
答案 2 :(得分:0)
您的文件可能没有按照您的想法进行格式化。里面必须有一些3元素的元组。
您可以在迭代时检查打印出整个data
或每个元素的内容,例如:
for elem in data:
print(elem)
ip, location, zone, dns = elem
#do stuff
这可以让你看到导致错误的原因。
顺便说一句,您的代码可以写得更好,例如:
def loadfile():
native_file = open("Zonechilds.csv","r")
data = [line.strip('\n').split(';') for line in native_file]
ultimo = data.pop()
native_file.close()
return data
(我实际上更多地写这个答案是因为代码风格的最后一个建议,而不是其他问题,我认为这只是容易验证的错误假设)