在python中解压缩错误

时间:2012-10-19 20:47:46

标签: python python-2.7 iterable-unpacking

我正在编写脚本,我需要这样做:

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时。

此代码发生了什么?

3 个答案:

答案 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

(我实际上更多地写这个答案是因为代码风格的最后一个建议,而不是其他问题,我认为这只是容易验证的错误假设)