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是一个明显的选择。如果您使用现有字段之一作为查找,adict会更好地为您服务。

如果你这样做:

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

,您可以像当前使用文件一样使用它来打印菜单,除了数据粘在周围,并且使用您输入的数字直接有意义。

您可能更喜欢将数字存储为数字类型而不是字符串;这样做很有意义,但弄清楚如何调整上面的代码以实现它留给读者作为练习。:-)

于 2012-05-13T09:23:55.257 回答
1

例如,您可以将输入存储在 alist而不是仅仅打印出来。

之后,从列表中获取正确的元组并将其分配给您的变量是微不足道的......

于 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 回答