[英]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.