0

lol.txt は次のとおりです。

1,2,3\n
\n
4,5,6\n
\n
AwesomeSauce,12.3,10\n

私が使用しているコード:

import csv

NumberAdult = input("Please enter the number of adults: ")
NumberAdult = int(NumberAdult)
NumberChild = input("Please enter the number of children: ")
NumberChild = int(NumberChild)
n = 0
with open ("lol.txt",'rt', newline = '\n') as f:
    csv_r = (line for line in csv.reader(f) if line)
    for row in csv_r:
        entries = [(name, float(price1), float(price2)) for name, price1, price2 in csv_r]
        for index, entry in enumerate(entries):
            price1 = float(entry[1])
            price2 = float(entry[2])
            print ("%i. %17s - %5.2f / %5.2f" % (index, entry[0], price1, price2))

choice = int(input("Which package would you like?: "))

packageChoice = (entries[choice])
for row in packageChoice:
    name = entry[0]
    AdultPrice = float(entry[1])
    ChildPrice = float(entry[2])

price = AdultPrice*NumberAdult + ChildPrice*NumberChild

print(name, price)

出力:

大人の人数を入力して
ください: 2 子供の人数を入力してください: 1
0. 4 - 5.00 / 6.00
1. AwesomeSauce - 12.30 / 10.00
どのパッケージをご希望ですか?: 1
AwesomeSauce 34.6

これが意味することは、lol.txt の最初の行を無視していることです。これは、この行をデータではなくフィールド名として扱っているように見えるためです1,2,3\ncsv.reader()

これを回避する方法はありますか?または何かを使用csv.dictreader()して、ファイル自体とは無関係にフィールド名を割り当てますか?

編集:csv.reader()気にしないでください。フィールド名として扱われません。したがって、問題はこのセクションにあるようです。

with open ("lol.txt",'rt', newline = '\n') as f:
    csv_r = (line for line in csv.reader(f) if line)
    for row in csv_r:

さて、ここで何をすべきかわかりません。これは、スクリプトを機能させるのに最も近いものです。ヒント、検索用語、何かありますか?

最終編集: 気にしないでください。すべて動作するようになりました! 忘れていたループがありました:

for row in csv_r:
   entries = [(name, float(price1), float(price2)) for name, price1, price2 in csv_r]

これにより、最初の行がスキップされました。その行をもう一度見させてくれた freenode の #python からのダッシュに感謝します!

新しい問題:

import csv

NumberAdult = input("Please enter the number of adults: ")
NumberAdult = int(NumberAdult)
NumberChild = input("Please enter the number of children: ")
NumberChild = int(NumberChild)
n = 0
with open ("lol.txt",'rt', newline = '\n') as f:
    csv_r = (line for line in csv.reader(f) if line)
    entries = [(name, float(price1), float(price2)) for name, price1, price2 in csv_r]
    for index, entry in enumerate(entries):
        price1 = float(entry[1])
        price2 = float(entry[2])
        print ("%i. %17s - %5.2f / %5.2f" % (index, entry[0], price1, price2))

choice = int(input("Which package would you like?: "))

packageChoice = (entries[choice])
for row in packageChoice:
    name = entry[0]
    AdultPrice = float(entry[1])
    ChildPrice = float(entry[2])

price = AdultPrice*NumberAdult + ChildPrice*NumberChild

print(name, price)

唯一の「オプション」は (オプションとして入力したものに関係なく) 2. です。これは、リストの最後の行であるためentriesです。

>>>
Please enter the number of adults: 2
Please enter the number of children: 1
0.                 1 -  2.00 /  3.00
1.                 4 -  5.00 /  6.00
2.      AwesomeSauce - 12.30 / 10.00
Which package would you like?: 1
AwesomeSauce 34.6
>>>

さて、問題はここにあると確信しています:

csv_r = (line for line in csv.reader(f) if line)
entries = [(name, float(price1), float(price2)) for name, price1, price2 in csv_r]
for index, entry in enumerate(entries):

または、メニューの結果に対してこれと同様の別のセクションを作成する必要がありますが、わかりません。両方の実装に取り​​組み、トラブルシューティングを試みます。

4

2 に答える 2

3

csvモジュールを誤って使用しています。ジェネレータを返すため、後続の呼び出しはより多くの行を返します。

事実上、同一のジェネレーターのリストを生成しています。

データを2回変換/チェックしているようです

csv_rの行をループし、リスト内包表記を使用して同じことを行います。これは冗長です。

これが簡略化されたバージョンです


import csv

NumberAdult = input("Please enter the number of adults: ")
NumberAdult = int(NumberAdult)

NumberChild = input("Please enter the number of children: ")
NumberChild = int(NumberChild)
n = 0

with open ("lol.txt") as f:
    csv_r = csv.reader(f)
    entries=[]
    for row in csv_r:
        #TODO:do checks here
        entries.append((row[0], float(row[1]), float(row[2])))

for index, entry in enumerate(entries):
    price1 = entry[1]  #do you need this?
    price2 = entry[2]  #do you need this?
    print ("%i. %17s - %5.2f / %5.2f" % (index, entry[0], price1, price2))

choice = int(input("Which package would you like?: "))
packageChoice = (entries[choice])
for row in packageChoice:
    name = entry[0]
    AdultPrice = float(entry[1])
    ChildPrice = float(entry[2]) 
price = AdultPrice*NumberAdult + ChildPrice*NumberChild
print(name, price) 
于 2012-05-14T06:05:31.503 に答える
3

コメントに入れるには長すぎるコメント。

csv.reader()は最初の行をヘッダーとして扱いません (DictReaderその動作のみを行います)。デバッグ用にいくつかの print ステートメントを挿入してみてください。何csv_rが含まれているかを確認すると役立ちます。


csv_r = (line for line in csv.reader(f) if line)

ジェネレーター式の括弧の代わりに、リスト式に角括弧を使用するつもりはありませんでしたか?


for row in csv_r:
        entries = [(name, float(price1), float(price2)) for name, price1, price2 in csv_r]

entriesのすべての行に対して 1 回リストを実体化してもcsv_rよろしいですか? 確かに、これを一度だけ行う必要がありますか?


于 2012-05-14T05:35:11.027 に答える