2013-07-01 5 views
9

ich ein Wörterbuch mit dem Inhalt meiner Textdatei füllen möchte? Auspacken (‚out3.txt‘)Wie kann ich fix Valueerror: zu viele Werte „in Python

Meine Textdatei von der ist. Form:

vs,14100 

mln,11491 

the,7973 

cts,7757 

... und so weiter ...

ich möchte mein Wörterbuch answer der Form sein:

answer[vs]=14100 

answer[mln]=11491 

... und so weiter ...

Mein Code ist:

import os 
import collections 
import re 
from collections import defaultdict 

answer = {} 
answer=collections.defaultdict(list) 
with open('out3.txt', 'r+') as istream: 
    for line in istream.readlines(): 
     k,v = line.strip().split(',') 
     answer[k.strip()].append(v.strip()) 

Aber ich:

ValueError: too many values to unpack

Wie kann ich dieses Problem beheben?

+4

Ich vermute, eine der Zeilen in der Eingabedatei hat mehr als ein Komma. Versuchen Sie 'grep ',. *,' ​​Out3.txt'. –

Antwort

10

Sie haben leere line s in die Eingabedatei und ich vermute, eine der line s, die Sie bei uns nicht zu viele Kommas in es (daher geteilt haben " zu viele Werte zum Auspacken ").

Sie können gegen diese schützen, etwa so:

import collections 

answer = collections.defaultdict(list) 
with open('out3.txt', 'r+') as istream: 
    for line in istream: 
     line = line.strip() 
     try: 
      k, v = line.split(',', 1) 
      answer[k.strip()].append(v.strip()) 
     except ValueError: 
      print('Ignoring: malformed line: "{}"'.format(line)) 

print(answer) 

Hinweis: Indem 1 in str.split(), alles nach dem ersten Komma wird v zugewiesen werden; Wenn dies nicht erwünscht ist und Sie bevorzugen, dass diese Zeilen zurückgewiesen werden, können Sie dieses Argument entfernen.

+0

immer noch der gleiche Fehler !! –

+0

Ah ja. Ich habe meine Antwort aktualisiert. – Johnsyweb

+0

danke, es hat funktioniert !! –

2

Ihre Textdatei enthält leere Zeilen, die nicht geteilt werden können. Sie müssen erkennen, wenn die Zeile leer ist:

for line in istream: 
    line = line.strip() 
    if line: 
     k,v = line.split(',') 
     answer[k.strip()].append(v.strip()) 
+1

Ich bekomme immer noch den gleichen Fehler! –

3

Ihre Lösung liefert nicht Ihre gewünschte Ausgabe. Sie werden haben (vorausgesetzt, es funktionierte), answer['vs'] = [14100], die unten tut, was Sie bestimmt:

import csv 

with open('out3.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    answer = {line[0].strip():line[1].strip() for line in reader if line} 
+1

+1 für die Verwendung von 'csv' (es sei denn, die Eingabedatei ist sehr spezifisch, einfach). – pepr

1

Du hast nicht die collections hier brauchen. Plain Old dict ist genug:

answer = {} 
with open('out3.txt', 'r+') as f: 
    for line in f: 
     lst = line.split(',') 
     if len(lst) == 2: 
      k = lst[0].strip() 
      v = lst[1].strip() 
      answer[k] = v 

print(answer['mln']) 
print(answer.get('xxx', 'not available')) 

Beachten Sie die answer.get() ist ähnlich answer[] aber Sie können den defaul Wert liefern.

Sie sollten .readlines() nicht in der Schleife verwenden. Auch die leere Zeile enthält das Newline-Zeichen. Auf diese Weise erkennt der Test if line: die leeren Zeilen nicht. Oder Sie müssen zuerst (oder rstrip) es entfernen, oder Sie können die Zeile auf die Liste aufteilen und die Anzahl der Elemente testen.

0

Ich bekomme den gleichen Fehler, wenn ich django Version 1.5 zu 1.3 änderte. Benutzerobjekte hatten unterschiedliche Werte in verschiedenen Versionen. Vielleicht ist das die gleiche Situation. Ich setze die Werte wieder in der Funktion, die ich benutzte, und es funktioniert.

Verwandte Themen