python解包错误

2024-06-01 03:19:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写剧本,我需要这样做:

for ip, location, zone, dns in data:

但我得到一个错误:

^{pr2}$

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

这个代码怎么了?在


Tags: csvinview列表fordatalenif
3条回答

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

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

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

2)在数据中的某个地方有一个秘密的三成员元组或列表。你真的,真的确定不是这样吗?是否所有([len(i)==4 for i in data])都为真?在

你的文件可能没有你想的那样格式好。里面一定有一些三元元组。在

您可以在迭代时检查打印出整个data或每个元素的内容,例如:

for elem in data:
    print(elem)
    ip, location, zone, dns = elem
    #do stuff

这允许您查看导致错误的原因。在

顺便说一句,您的代码可以写得更好,例如:

^{pr2}$

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

旁白:在Python中读取csv数据的错误方法是使用csv模块。您的整个代码将变成类似于:

import csv

with open("zonechilds.csv", "rb") as fp:
    reader = csv.reader(fp, delimiter=";")
    data = [tuple(line) for line in reader]

产生

^{pr2}$

相关问题 更多 >