2016-06-26 4 views
3

Ich bekomme einen Fehler beim Sortieren von ungefähr 470000 Tupeln. Ich lese Daten aus CSV-Datei in die Liste von TupelnValueError: zu viele Werte zum Entpacken mit zu vielen Tupeln

fp = open(filename, 'Ur') 
for line in fp: 
    listOfCitiesTuples.append(tuple(line.strip().split(','))) 
fp.close() 

Tupeln einige Städte Namen mit einer Nummer zugeordnet sind.

[('Chiredzi', '4117'), ('Gaths', '4117'), ('Masvingo', '4117'), ('Chivhu', '4120'), ('Gweru', '4120'), ('Kwekwe', '4120'), ('Mvuma', '4120'), ('Redcliffe', '4120'), ('Shurugwi', '4120'), ('Zvishavane', '4120')] 

Ich sammle alle zu derselben Nummer zugeordnet Namen zusammen in einer Liste und wo es sich auf diese Zahl und bilden eine dict all dieser Elemente, so etwas wie dieses

{'1': ['Bombuflat', 'Garacharma', 'Port Blair', 'Rangat'], '113': ['Hydra', 'Kouba'], '294': ['Vienna', 'Wien'], '1327': ['Lambarene', 'Ndjole']} 

folgende Methode verwenden zu erreichen es

for k, v in listOfCitiesTuples: dictOfCitiesTuples.setdefault(v, []).append(k) 

Dies funktioniert gut für eine kleinere Anzahl von Tupeln (ich habe 20.000 bisher getestet), aber scheint nicht, wie 470000. auf größere Anzahl zu arbeiten

Könnte große Anzahl von Tupel ein Problem sein oder könnte es aufgrund beschädigter Datei sein? Wenn es aufgrund einiger beschädigter Daten in einer Datei ist, gibt es etwas, was ich tun kann, um herauszufinden, welche beschädigten Daten es ist, versuchen Sie, Ausnahme?

ich diesen Fehler

File "/../view.py", line 186, in getCities 
    for k, v in listOfCitiesTuples: dictOfCitiesTuples.setdefault(v, []).append(k) 
ValueError: too many values to unpack (expected 2) 
+0

Importieren Sie dieses Tupel in einen Pandas-Datenrahmen und prüfen Sie, ob die Datei beschädigt ist. – min2bro

+0

Was ist der vollständige Fehler? Es ist wahrscheinlicher, dass Sie 1 oder 3 Werte haben, die Sie in zwei entpacken. Vielleicht hat eine Stadt ein Komma in ihrem Namen, also bekommt man 3 Werte. –

+0

@jas das ist nicht der volle Fehler. Welche Codezeile wird ausgeführt? –

Antwort

2

Basierend auf Ihrem Titel ValueError: too many values to unpack Sie haben einige Daten in einem anderen Format als Sie erwarten.

Insbesondere haben einige Zeilen mehr als ein Komma, das ein Tupel mit mehr als 2 Werten erzeugt, was dann den Fehler verursacht, wenn Sie versuchen, sie zu entpacken.

Während Sie über die Datei iterieren, können Sie überprüfen, ob das Tupel die richtige Länge hat. Wenn Sie fehlerhafte Daten finden, können Sie sie notieren und beheben oder ignorieren. Hängt von Ihren Bedürfnissen ab.

with open(filename, 'Ur') as infile: 
    for line_num, line in enumerate(infile): 
     vals = tuple(line.strip().split(',')) 
     if len(vals) == 2: 
      listOfCitiesTuples.append(vals) 
     else: 
      bad_data.append((line_num, line)) 
+0

Problem war eine Zeile hatte zwei Kommata, d. h. Putignano ,, 1872. Danke für den Trick, die Linie zu finden – jas

0

Mit an Ihrem Code sucht und eine Vermutung nehmen, passiert sein könnte, was ist die letzte Zeile der Datei in ihm eine zusätzliche Zeile mit nichts sein könnte. So gibt line.strip().split(',') eine Liste der Größe 1 zurück, die ein Tupel der Größe 1 wird, die in Ihrer for-Schleife explodiert. Fügen Sie die folgende Wache:

fp = open(filename, 'Ur') 
for line in fp: 
    if len(line.strip()) > 0: 
    listOfCitiesTuples.append(tuple(line.strip().split(','))) 
fp.close() 
+0

Sie könnten eine Frage stellen, anstatt raten zu müssen. Es ist Sache des OP, ihre Frage zu klären. –

+0

@ pgreen2 Problem lag an beschädigten Daten. eine Zeile verursachte das Problem – jas

Verwandte Themen