簡體   English   中英

python中的解包錯誤

[英]Unpacking error in python

我正在編寫腳本,我需要這樣做:

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個成員列表。

我不明白為什么它告訴我需要4個以上的成員,而我卻需要3個以上的成員。

這段代碼是怎么回事?

如果數據的所有成員都是4成員元組或4成員列表,並且您沒有在for循環中修改數據中的任何更高版本的列表,那么我很確定沒有任何可能的方法從數據中解包元素時發生異常。

我可以看到兩種最可能的解釋:

1)您誤認為在哪里引發了異常。 它發生在for循環內的某處,而不是在分配ip,位置,區域和dns時發生。 檢查您的堆棧跟蹤,並確保行號確實與for循環的頂部匹配。

2)數據中某處有一個偷偷摸摸的三元組或列表。 您真的,真的確定不是嗎? 全部([len(i)== 4 for i in data])全部成立嗎?

順便說一句:這是在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

您的文件可能格式不正確。 內部必須有一些3元素元組。

您可以在遍歷data檢查內容以打印出整個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

(實際上,我對這個問題的回答更多是因為對代碼樣式的最后建議,而不是針對其余問題,我認為這只是容易驗證的錯誤假設)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM