2012-04-30 20 views
7

Tôi đã có một trình đơn hiện có cung cấp cho bạn các tùy chọn L hoặc D. L nên tải nội dung của một tệp và D sẽ hiển thị nó.ValueError: cần nhiều hơn 1 giá trị để giải nén 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)) 

Tuy nhiên, khi tôi cố gắng chạy này, tôi nhận được lỗi:

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

Tại sao tôi nhận được lỗi này?

+1

FYI: Bạn cũng có thể nói 'option.upper() == 'L'' và làm cho mã của bạn dễ đọc hơn và duy trì/nâng cấp. – bossylobster

+0

ý tưởng hay. cảm ơn bạn – EatMyApples

Trả lời

12

Điều này có nghĩa là có một dòng trong packages.txt rằng, khi bạn tách khoảng trắng và phân tách bằng dấu phẩy, không cung cấp chính xác ba phần. Trong thực tế, có vẻ như nó chỉ cho 1 mảnh ("cần nhiều hơn 1 giá trị để giải nén"), điều này gợi ý rằng có một dòng không có dấu phẩy nào cả.

Có thể có các dòng trống hoặc nhận xét trong packages.txt?

Bạn có thể cần mã của mình thông minh hơn về phân tích cú pháp nội dung của tệp.

+0

Ok đã hoạt động, nhưng bây giờ để in ((tên), "-", (người lớn), "/", (con)) nó nói rằng biến "tên" không được xác định? – EatMyApples

+0

Tại sao bạn mong đợi 'tên' được định nghĩa ở đó? Nó chỉ được thiết lập khi tùy chọn 'L' được lấy. Bạn đã thực hiện một L trước khi D gây ra khối thứ hai được sử dụng? –

3

Lỗi này đang xảy ra tại

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

Khi bạn gán ba biến ở bên trái nó là giả sử bạn có một 3-tuple ở bên phải. Trong ví dụ này, xuất hiện line không có dấu phẩy do đó line.split(',') kết quả trong danh sách chỉ có một chuỗi, do đó lỗi "hơn giá trị để giải nén".

+0

Vì vậy, bạn đề nghị tôi nên làm gì? – EatMyApples

+0

Chia thành các trường hợp có điều kiện về giá trị của 'line.split (',')', đặc biệt là độ dài của đầu ra. Nếu bạn cho rằng tệp cũng sẽ có ba phần tử, bạn cần phải tìm ra lý do tại sao dòng này lại không. – bossylobster

+0

i sửa nó, nhưng bây giờ để in ((tên), "-", (người lớn), "/", (con)) nó nói rằng biến "tên" không được xác định? – EatMyApples

2

line.split(',') trả về một bộ tuple. Sau đó, bạn un-pack rằng tuple bằng cách viết:

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

Nếu tuple không có đúng ba yếu tố thì bỏ bao bì bị lỗi. Trong trường hợp của bạn, thông báo lỗi nói rằng bạn chỉ có một phần tử. Vì vậy, line.split(',') rõ ràng đang trả về một bộ tuple chỉ với một phần tử. Và điều đó có nghĩa là line không có dấu phẩy.

Có thể điều này có nghĩa là dữ liệu đầu vào của bạn không phải là những gì bạn mong đợi. Bạn yêu cầu rằng line là một chuỗi chứa ba giá trị được phân tách bằng dấu phẩy nhưng có một dòng trong dữ liệu đầu vào của bạn không đáp ứng yêu cầu đó.

+0

Ít hơn hoặc nhiều hơn ba yếu tố. Bạn đang ràng buộc chính xác ba yếu tố ở đây. – bossylobster

+0

Có cách nào để khắc phục điều đó không? – EatMyApples

+1

Vâng, bạn phải tìm ra lý do tại sao điều này xảy ra. Chúng tôi không thể biết tại sao. Tất cả những gì chúng tôi có thể làm là cho bạn biết rằng dữ liệu đầu vào của bạn không phải là những gì bạn mong đợi. –

Các vấn đề liên quan