9

オプションLまたはを提供する既存のメニューがありますDLファイルの内容をロードしてD表示する必要があります。

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))

ただし、これを実行しようとすると、エラーが発生します。

name,adult,child= line.split(',')
ValueError: アンパックするには複数の値が必要です

なぜこのエラーが発生するのですか?

4

4 に答える 4

14

これは、packages.txt空白を削除してコンマで分割すると、正確に 3 つの部分が得られないという行があることを意味します。実際、それは 1 個しか与えないようです (「アンパックするには複数の値が必要です」)。これは、コンマがまったくない行があることを示唆しています。

packages.txt?に空白行またはコメント行がある可能性があります。

ファイルの内容の解析について、よりスマートなコードが必要になる場合があります。

于 2012-04-30T23:53:31.830 に答える
3

このエラーはで発生しています

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

左側に 3 つの変数を割り当てると、右側に 3 タプルがあると想定されます。この例でlineは、カンマがないように見えるため、文字列が 1 つだけのリストになり、「展開する値が2line.split(',')つ以上あります」というエラーが発生します。

于 2012-04-30T23:50:44.557 に答える
2

line.split(',')タプルを返します。次に、次のように記述して、そのタプルをアンパックします

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

タプルに正確に 3 つの要素がない場合、アンパックは失敗します。あなたの場合、エラーメッセージには、要素が1つしかないことが示されています。したがって、line.split(',')要素が 1 つだけのタプルを返すことは明らかです。つまりline、コンマがないということです。

おそらくこれは、入力データが期待どおりではないことを意味します。カンマで区切られた 3 つの値を含む文字列である必要lineがありますが、入力データにその要件を満たさない行があります。

于 2012-04-30T23:52:10.877 に答える
0

余分な行やチェックを追加せずにそれを回避したい場合、1 つの解決策は分割を次のように変更することです。

name, adult, child, garbage = (line+',,,').split(',', maxsplit=3)

これにより、欠落している値が黙って無視され、変数は空になります。nameつまり、adultとの値childが存在する場合は入力され、元のファイルに存在しない場合は空になります。すべての意図と目的において、変数は無視してgarbageください。

于 2020-08-20T02:11:16.660 に答える