0

我正在制作一个脚本,我需要这样做:

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

这段代码发生了什么?

4

3 回答 3

4

如果 data 的所有成员都是 4 成员元组或 4 成员列表,并且您没有在 for 循环期间修改 data 中的任何后续列表,那么我很确定您不可能得到这个从数据中解包元素时出现异常。

我能看到的两个最有可能的解释:

1)您对引发异常的位置有误。它发生在你的 for 循环中的某个地方,而不是在分配 ip、位置、区域和 dns 时。检查您的堆栈跟踪并确保行号确实与 for 循环的顶部匹配。

2)在数据的某处有一个鬼鬼祟祟的 3 成员元组或列表。你真的,真的确定不是这样吗?all([len(i) == 4 for i in data]) 是真的吗?

于 2012-10-19T21:03:38.520 回答
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
于 2012-10-19T21:06:55.463 回答
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

(实际上,我之所以写这个答案,是因为最后一个关于代码风格的建议,而不是我认为很容易验证的错误假设的其余问题)

于 2012-10-19T21:05:54.220 回答