从csv中检索数据,并将第x行和第y列的值分配给变量。 Py3.2,*作业*

时间:2012-05-13 08:55:11

标签: python python-3.x

我有一个评估要做,到目前为止这是我的代码:

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,数字必须是浮点数。

我无法解决这个问题,并且如果可能的话可以使用一些指导。

谢谢大家。

在被问到之前,我意识到我忘了提到:我已经用Google搜索,并浏览了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 个答案:

答案 0 :(得分:2)

@mata有权利,但我觉得有必要在评论中详细说明他们的回答。

由于你需要回顾你的数据而不是仅仅打印它,所以有必要让它以某种方式存在。一旦达到这一点,您需要担心的最重要的事情是使用何种数据结构 - 如果您选择的数据结构与您希望如何使用数据非常匹配,则代码变得非常简单。

所以,你的逻辑看起来像:

  1. 将数据解析为某种数据结构
  2. 使用此数据结构打印菜单
  3. 获取用户输入,并使用它来选择正确的数据位
  4. 由于用户输入是一个数字,表示数据在文件中的位置,list是一个显而易见的选择。如果您使用其中一个现有字段作为查找,dict会更好地为您服务。

    如果你这样做:

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

    ,你可以按照当前使用文件的方式来打印菜单,除了数据附近,并且使用你输入的数字是直接有意义的。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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)
>>> 

答案 3 :(得分:0)

以open(“lol.txt”,“rt”,newline ='\ n \ n')作为f:

将其更改为'\ n'

打开(“lol.txt”,“rt”,换行符='\ n')为f: