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つのメンバーリストであると想定できます。

私がそれに4を与えているとき、なぜそれが3人以上のメンバーが必要であると私に言ったのか分かりません。

このコードで何が起こっているのですか?

4

3 に答える 3

4

data のすべてのメンバーが 4 メンバーのタプルまたは 4 メンバーのリストであり、for ループ中に data の後のリストを変更していない場合、これを取得できる方法はないと確信しています。データから要素をアンパックするときの例外。

私が見ることができる最も可能性の高い2つの説明:

1) 例外が発生している場所を間違えています。IP、場所、ゾーン、およびDNSを割り当てるときではなく、forループ内のどこかで発生しています。スタック トレースを調べて、行番号が for ループの先頭と実際に一致していることを確認してください。

2) データ内のどこかに卑劣な 3 メンバーのタプルまたはリストがあります。これが事実ではないことを本当に、本当に確信していますか?all([len(i) == 4 for i in data]) は True になりますか?

于 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 に答える