2012-05-13 16 views
1

我有一个评估做的,这是我到目前为止的代码:从csv中检索数据,并将行x和列y的值分配给变量。 Py3.2,*功课*

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从文件中检索一行,并使用名称,number1和number2中的数据,因此对于NameChoice == 1,name = herp,number1 = 123和number 2 = 456,并且这些数字必须是浮点数。

我很难解决这个问题,如果可能的话可以使用一些指导。

谢谢大家。

在被问到之前,我意识到我忘了提及:我已经使用Google搜索并通过Python指南和我的教科书进行了浏览。不过,我并不完全相信我知道我在找什么。

润成一个新的问题: 我需要能够采取CSV文本用“\ n \ n”而不是“\ n”,所以文字更像是以下几点:

herp,123,456 

derp,321,654 

hurr,213,546 

代码立昂的我(非常轻微调整)版本使用:

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'作为换行符不可接受,但我想知道是否有解决方法?

注:搞砸了一个编辑,从代码的调试与“换行=‘\ 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值处理的空白就像它被告知要做的那样,一排排有用的排,而且那里什么也没有。

回答

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) 
>>> 
+0

谢谢大家, 我觉得我快到了,但是我不打算在这之前关闭这个问题,我已经实施了一切,并检查了我的工作。 禁止一些拧紧,它应该在4或5小时内关闭(现在是晚上9点,我需要出去半个小时或更长的时间来清理我的头)。 再次感谢。 当我有能力时,我会为你投票。 – Epidemic

1

例如,您可以将输入存储在list中,而不是将其打印出来。之后是微不足道的获取从列表中正确的元组,并将其分配给您的变量

...

2

@mata有权利,但我觉得需要详细阐述他们的答案比我可以在评论中更多。

既然您需要回顾您的数据而不是仅仅打印它,那么让它以某种方式坚持是有道理的。一旦你达到这一点,你需要担心的最重要的事情是使用什么样的数据结构 - 如果你选择的数据结构与你想要如何使用数据完全匹配,代码就变得非常简单。

所以,你的逻辑将是这样的:

  1. 解析数据转换成某种数据结构
  2. 走这个数据结构的打印出来的菜单
  3. 获取用户输入,并使用它选择数据

的右位由于用户输入多远下来的数据是文件代表数字,list是一个显而易见的选择。如果您使用其中一个现有字段作为查询,则dict可以更好地为您提供服务。

如果你这样做:

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

,你可以走它来打印菜单以同样的方式,你当前使用的文件,除了数据支左右,并使用数字你在IS直接有意义。

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

0

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

它变化到 '\ N'

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