1

やるべき評価があります。これまでの私のコードは次のとおりです。

number1 = input("Number1? ")

number2 = input("Number2? ")

packages = csv.reader(open('lol.txt', newline='\n'), delimiter=',')
for PackName,PriceAdultString,PriceChildString in packages:
    n += 1
    PriceAdult = float(PriceAdultString)
    PriceChild = float(PriceChildString)
    print("%i. %17s - $%4.2d / $%4.2d" % (n, PackName, PriceAdult, PriceChild))

NameChoice = input("Which name would you like? Choose using a number: ")

csv.readerで使用されるlol.txtは、次のもので構成されています。

herp,123,456    
derp,321,654    
hurr,213,546

ここで、NameChoiceを使用してファイルから行を取得し、その中のデータをname、number1、およびnumber2として使用できるようにする必要があります。したがって、NameChoice == 1の場合、name = herp、number1 = 123、number 2=456です。 、および数値は浮動小数点数である必要があります。

私はこれを理解するのに苦労しています、そしてそれが可能であればいくつかのガイダンスを使うことができます。

皆さんありがとう。

尋ねられる前に、私は言及するのを忘れていることに気づきました。私はグーグルで検索し、Pythonガイドと教科書を調べました。しかし、私は自分が何を探しているのかを完全に確信しているわけではありません。

新しい問題が発生しました。「\n」ではなく「\n\ n」を使用してCSVテキストを取得できるようにする必要があるため、テキストは次のようになります。

herp,123,456

derp,321,654

hurr,213,546

Li-Aungが使用したコードの私の(非常にわずかに調整された)バージョン:

import csv
with open ("lol.txt",'rt', newline = '\n\n') as f:
    csv_r = csv.reader (f)
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r]

for index, entry in enumerate(entries):
    print ("%2i. %-10s %5.2f %5.2f" % (index, entry[0], entry[1], entry[2]))

choice = int(input("Choose a number: "))

print (entries[choice])

これは例外を返します:

Traceback (most recent call last):
  File "C:/Python32/eh", line 2, in <module>
    with open ("lol.txt",'rt', newline = '\n\n') as f:
ValueError: illegal newline value: 

さて、デバッグはかなり明確です-'\ n \ n'は改行指定子として受け入れられませんが、これを回避する方法があるかどうか疑問に思いましたか?

注:前の編集を台無しにすると、「newline='\n'」のコードからのデバッグは次のようになります。

Traceback (most recent call last):
  File "C:/Python32/eh", line 4, in <module>
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r]
  File "C:/Python32/eh", line 4, in <listcomp>
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r]
ValueError: need more than 0 values to unpack

これは、各有用な行の間の空白を0の値で処理するように指示されたとおりに処理し、そこには何もなかったためです。

4

4 に答える 4

2

@mataにはその権利がありますが、コメントでできる以上に彼らの答えを詳しく説明する必要があると感じています.

データを印刷するだけでなく、参照する必要があるため、何らかの方法でデータを保持することは理にかなっています。その点に到達すると、最も心配する必要があるのは、どのような種類のデータ構造を使用するかということです。選択したデータ構造がデータの使用方法とほぼ一致する場合、コードは非常に単純になります。

したがって、ロジックは次のようになります。

  1. データをある種のデータ構造に解析する
  2. このデータ構造をたどってメニューを印刷します
  3. ユーザー入力を取得し、それを使用して正しいデータ ビットを選択します

ユーザー入力は、データがファイルのどこまであるかを表す数値であるため、alistは当然の選択です。既存のフィールドの 1 つをルックアップとして使用している場合は、 のdict方が適しています。

もしあなたがそうするなら:

data = list(csv.reader(open('lol.txt', newline='\n'), delimiter=','))

、現在ファイルを使用しているのと同じ方法でメニューを印刷するためにそれを歩くことができます。

数値を文字列ではなく数値型として格納することを好む場合があります。それは理にかなっていますが、それを達成するために上記のコードを調整する方法を理解することは、読者の演習として残されています。:-)

于 2012-05-13T09:23:55.257 に答える
1

listたとえば、入力を出力するだけでなく、入力を保存することもできます。

その後、リストから正しいタプルを取得して変数に割り当てるのは簡単です...

于 2012-05-13T09:08:32.570 に答える
1

ファイル全体をリストに保存します。

import csv
with open ("lol.txt",'rb') as f:
    csv_r = csv.reader (f)
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r]

for index, entry in enumerate(entries):
    print ("%2i. %-10s %5.2f %5.2f" % (index, entry[0], entry[1], entry[2]))

choice = int(raw_input("Choose a number: "))

print (entries[choice])

出力:

 0. herp       123.00 456.00
 1. derp       321.00 654.00
 2. hurr       213.00 546.00
Choose a number: 0
('herp', 123.0, 456.0)
>>> 
于 2012-05-13T09:12:52.670 に答える
0

open ("lol.txt",'rt', newline = '\n\n') を f:

「\n」に変更してください

open ("lol.txt",'rt', newline = '\n') を f:

于 2016-09-14T17:52:02.343 に答える