2016-11-01 5 views
2

私は非常に単純なテキストファイルを持っていますが、この例では、対応する金額の支出があるストアのリストで構成されています。 (タブ間隔を置いた)ファイルには、次のようになります。inループと比較したforループでのタプル展開の振る舞い

7-Eleven  7.48 
Paradies 28.00 
Shoppers 68.26 

私の目標は、セブン - イレブンが、すべてのためのお金の量を合計することです。

price = 0.0 
with open('stores.txt', 'r') as f: 
    for line in f: 
     line = line.strip('\n').split('\t') 
     for shop, priceStr in line: 
      if not shop == '7-Eleven': 
       price += float(priceStr) 

あり、コードの中間部分をきれいにすることができるいくつかの単純化は、おそらくですが、私はとのトラブル抱えている「行のお店のために、priceStr:」ビットを私のコードは次のようになります。私の理解では、 "shop、priceStr"を実行すると、現在の行の内容をタプルとして解凍し、変数shopとpriceStrに代入する必要があります。しかし、私はエラーを取得する:

ValueError: too many values to unpack 

しかし、私は、現在の行を取ると私は

shop, priceStr = line 
print shop + ":" + priceStr 

7-Eleven: 7.48 

を取得し、ループの外にそれを解凍する場合、私は、forループのネストされたの間で異なるかを理解していないとインラインコード誰かが私に助言してくれる?このコードは、python2.7とpython3.4

おかげ

+1

ファイルの最後に空白行がありますか? – Fejs

+0

'split( '\ t')の代わりに' split() 'を実行しようとしました。' split'に引数を渡すと、返されたリストに空の文字列が残ることがあります –

+0

万が一、ファイル? – James

答えて

3

jasonharperの答えはあなたの当面の問題のために正しいことで同じ動作しますが、あなたはまた、素朴な分割になるだろうラインのいくつかの浮遊\tを、持っているかもしれませんメソッドは、文字列を2つ以上の項目に分割します。

line = line.split('\t', maxsplit=1) 

またはこのような、別の変数に(もしあれば)過剰のアイテムを結合することによって行をアンパック:

いずれかの他のすべての\tの文字を無視するmaxsplit引数を使用して分割を制限

rest変数は余分な項目がない場合の空のリストになります。これにより、誤った形式のエラーが発生した場合にコードをより堅牢にして、処理や報告が可能になります。

2

は1つだけの分割を行うことsplitを伝えることができますし、それはあなたがこれを行う場合は、おそらくもstripアンパック値の各安全である必要があり、余分な\t

line = line.strip('\n').split('\t', maxsplit=1) 

あらゆる可能性を無視します。 floatが空白を無視すると、それがなければ動作するかもしれませんが。

shop, priceStr = shop.strip(), priceStr.strip() 
2

line = line.strip('\n').split('\t')を行った後、ライン2つの要素(他のポスターが指摘したように、全く無関係なタブを想定していない)との組です。これを繰り返し実行すると、まず店名、次に価格が取得されます。したがって、for shop, priceStr in line:を実行すると、ショップ名を2つの変数に展開してから、2つの変数に価格を展開しようとします。もちろん両方の試みが失敗する。ここでは反復は必要ありません。タプルを2つの要素に分割するためにshop, priceStr = lineを実行するか、コード行を保存して直接実行することができますshop, priceStr = line.strip('\n').split('\t')

+0

偉大な観察、私は最初の読んでそれを逃した。ただし、質問に記載されているエラーメッセージはコードに対応していません(これは主に私を捨てたものです)。エラーメッセージは 'ValueError:解凍するのに十分な値ではありません(期待値2、1)'のようなものでなければならないので、問題のコードはOPが使用しているコードではないと思われます。 – dkasak

+0

@dkasak私はpython2.7.6を使用していますが、エラーメッセージは "ValueError:アンパックする値が多すぎます" – Dai

+0

ありがとうございました。私は別のforループに入ることなく変数を解凍できることを知っていましたが、なぜどちらのケースでもタプル展開の動作が異なるのではないかと思っていました。 – Dai