2012-08-08 51 views
1

目前,我已经设置了这样一个CSV文件:使用Python raw_input从CSV文件获取特定值?

Element,Weight 
"Hydrogen","1" 
"Oxygen","16" 

它最终将所有部件和它们的原子量的旁边,而是将在所有是毫无意义,除非我得到这个问题首先解决。

主要Python程序如下:

import csv 
reader = csv.reader(open("chem.csv", "rb")) 

first = raw_input("Enter first element: ") 
second = raw_input("Enter second element: ") 

if first == "Hydrogen" or "hydrogen": 
    for Weight in reader: 
     print Weight 

else: 
    print "No." 

现在,你也许可以从讲,在这里我的目标是让程序显示氢的重量从CSV文件中取出, 目前。但是,目前它只是最终显示如下:

Enter first element: hydrogen 
Enter second element: oxygen 
['Element', 'Weight'] 
['Hydrogen', '1'] 
['Oxygen', '16'] 

所以,基本上,我怎样才能让这个不言而喻的氢气行,然后取从第二列中的权重值?我应该可以从那里去完成剩下的程序,但这部分让我陷入困境。

作为次要的东西,是否有可能拥有它,以便我不必在Python主程序和CSV文件中拥有本质上的元素列表?它会让杂乱减少很多,但我无法弄清楚。

+0

我认为你的意思是'第一==“氢”或首先==“氢”'由'first ==“氢”或“氢”?也可以是“第一”(“氢”,“氢”)。 – 0605002 2012-08-08 19:53:41

回答

3

不是迭代数据,而是以易于访问的方式来存储数据。一个字典映射名称到重量。然后,您可以只查找输入的字符串并显示结果(如果没有,则不显示)。

import csv 

#Read in data anbd store it in dictionary. 
#The element name will be stored in lowercase. 
elemen_data = { element.lower():int(weight) for element,weight in csv.reader(open("in", "rb"))} 

first = raw_input("Enter first element: ") 
second = raw_input("Enter second element: ") 

#Look for the weight of the entered element (after converting it to all lowercase) 
weight_first = elemen_data.get(first.lower()) 
weight_second = elemen_data.get(second.lower()) 

if weight_first is not None: 
    print 'First Element:', first, 'Weight:', weight_first 
else: 
    print 'First Element', first, 'not found' 

if weight_second is not None: 
    print 'Second Element:', second, 'Weight:', weight_first 
else: 
    print 'Second Element', second, 'not found' 

从你的程序逻辑分开存储你的数据是有意义的,如果你希望能够方便地更改数据而不触及程序。所以读取一个csv文件是绝对没问题的。 (只要数据具有合理的大小)

+0

我曾经看到字典被解释为这种事情的解决方案之前...但我永远不知道如何让一个正常运行。谢谢你。我不认为你能够提供一些关于如何添加氧气的指标,对吗?我假定它使用elif,但通过了我意识到我完全被卡住了一次。 – dantdj 2012-08-08 19:19:18

+0

你可以在Python文档(http://docs.python.org/tutorial/datastructures.html)中详细了解字典是如何工作的,但查找是在'elemen_data.get(first)'中完成的。在这里它会查找先输入的内容并检索关联的数据。 – 2012-08-08 19:22:32

+0

啊,你的意思是因为大写。我会在一分钟内补充一点。但基本上,您可以将所有字符串转换为小写字母以避免该问题。 – 2012-08-08 19:26:08

1

问题是,当您遍历csv.reader对象时,您会收到csv文件行作为行单元格值列表。所以你可以尝试下你的情况:

if first in ("Hydrogen", "hydrogen"): 
    for Weight in reader: 
     if Weight[0] == first: 
      print Weight[1] 

这不是最好的代码,但它会返回你想要的值。

+0

确实如此,欢呼声。我想我会按照上面的字典路线,但是......当我可以弄明白的时候! – dantdj 2012-08-08 19:20:03

0

第一个问题:

if first == "Hydrogen" or "hydrogen": 

这将不会返回你想要的。要么你想:

if first == 'Hydrogen' or first == 'hydrogen': 

if first in ['Hydrogen', 'hydrogen']: 

或者更好的是:

if first.lower() == 'hydrogen' 

这将适用于所有已资本化,氢气等。

然后,你可以做你想做的:

for row in reader: 
    if row[0].lower() == first.lower(): 
     print row[1] 

当然,这可以通过使用值的字典被清理了一下;你可能不想为每个元素使用if声明,但是你去了。

+0

是的,大量的if语句很大程度上是因为我真的刚刚开始,所以字典以及如何创建它们......对我来说有点复杂。但是,嘿,这是一个学习过程;我想现在我应该至少能够从CSV文件中创建一个字典,这是一种进步。 – dantdj 2012-08-08 19:24:21