2012-04-30 7 views
7

Mam istniejące menu, które daje opcje L lub D. L powinien załadować zawartość pliku i powinien go wyświetlić D.ValueError: potrzeba więcej niż 1 wartość, aby rozpakować python

if option == "l" or option == "L": 
    with open("packages.txt") as infp: 
     for line in infp: 
     line = line.rstrip() 
     name,adult,child= line.split(',') 

if option == "d" or option == "D": 
    print ((name)," - ",(adult),"/",(child)) 

Jednak, gdy próbuję uruchomić to pojawia się błąd:

name,adult,child= line.split(',')
ValueError: need more than 1 value to unpack

Dlaczego mam ten błąd?

+1

FYI: Możesz również powiedzieć: 'option.upper() == 'L'' i spraw, aby twój kod był nieco łatwiejszy w czytaniu i utrzymaniu/aktualizacji. – bossylobster

+0

dobry pomysł. dziękuję – EatMyApples

Odpowiedz

12

Oznacza to, że istnieje linia w packages.txt, która po usunięciu spacji i rozdzieleniu na przecinkach nie daje dokładnie trzech elementów. W rzeczywistości wydaje się, że daje tylko 1 element ("potrzeba rozpakowania więcej niż 1"), co sugeruje, że istnieje linia bez przecinków.

Być może są puste lub linie komentarza w packages.txt?

Twój kod może być potrzebniejszy, jeśli chodzi o analizowanie zawartości pliku.

+0

OK, które działało, ale teraz dla print ((nazwa), "-", (dorosły), "/", (dziecko)), czy mówi, że zmienna "nazwa" nie jest zdefiniowana? – EatMyApples

+0

Dlaczego spodziewałbyś się, że "nazwa" zostanie tam zdefiniowana? Ustawiane jest tylko wtedy, gdy wybrana jest opcja 'L'. Czy wykonałeś literę L przed literą D, która powoduje użycie tego drugiego bloku? –

3

Ten błąd występuje w

name,adult,child= line.split(',') 

Po przypisaniu trzy zmienne na lewo to jest przy założeniu, że masz 3-krotki po prawej stronie. W tym przykładzie wygląda na to, że line nie ma przecinka, dlatego line.split(',') powoduje wyświetlenie listy zawierającej tylko jeden ciąg, a więc błąd "więcej niż wartość rozpakowania".

+0

Więc co sugerujesz, że powinienem zrobić? – EatMyApples

+0

Dzieli się na przypadki, które warunkują wartość 'line.split (',')', w szczególności długość wyjścia. Jeśli założysz, że plik będzie miał trzy elementy, musisz dowiedzieć się, dlaczego ta linia nie działa. – bossylobster

+0

Naprawiłem to, ale teraz dla print ((name), "-", (adult), "/", (child)) to on mówi, że zmienna "name" nie jest zdefiniowana? – EatMyApples

2

line.split(',') zwraca krotkę. Następnie un-pack że krotka pisząc:

name,adult,child= line.split(',') 

Jeśli krotka nie mają dokładnie trzy elementy, a następnie un-packing zawiedzie. W twoim przypadku komunikat o błędzie stwierdza, że ​​masz tylko jeden element. Tak więc, line.split(',') wyraźnie zwraca krotkę z tylko jednym elementem. A to oznacza, że ​​line nie ma przecinków.

Prawdopodobnie oznacza to, że dane wejściowe nie są zgodne z oczekiwaniami. Wymagane jest, aby line był łańcuchem zawierającym trzy oddzielone przecinkami wartości, ale w danych wejściowych znajduje się linia, która nie spełnia tego wymagania.

+0

Mniej lub więcej niż trzy elementy. Jesteś tutaj związany z trzema elementami. – bossylobster

+0

Czy istnieje sposób, aby to naprawić? – EatMyApples

+1

Cóż, musisz się dowiedzieć, dlaczego tak się dzieje. Nie możemy wiedzieć, dlaczego. Wszystko, co możemy zrobić, to powiedzieć, że twoje dane wejściowe nie są takie, jakich oczekujesz. –

Powiązane problemy