1

目前,我有一个这样的 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 文件中拥有本质上是元素列表的内容?它会减少很多混乱,但我就是想不通。

4

3 回答 3

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 文件是绝对可以的。(只要数据大小合理)

于 2012-08-08T19:13:30.323 回答
1

问题是,当您遍历 csv.reader 对象时,您会收到 csv 文件行作为行单元格值的列表。因此,您可以尝试下一个案例:

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

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

于 2012-08-08T19:07:54.320 回答
0

第一个问题:

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

那不会返回你想要的。你要么想要:

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

或者

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

或者更好:

if first.lower() == 'hydrogen'

这适用于所有大写字母,例如 HYDrogen。

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

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

当然,这可以通过使用值字典来稍微清理一下;您可能不希望if对每个元素都有一个声明,但是您就可以了。

于 2012-08-08T19:14:38.683 回答