目前,我有一个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文件中拥有本质上是元素列表的内容?它会减少很多杂乱,但我就是弄不明白。
发布于 2012-08-09 03:13:30
与迭代数据相比,以一种容易访问的方式存储数据可能更好,例如将名称映射到权重的字典。然后,您可以只查找输入的字符串并显示结果(如果没有结果,也可以不显示)。
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-09 03:07:54
问题是,当您迭代csv.reader对象时,您会收到csv文件行作为行单元格值的列表。所以你可以为你的案例尝试下一步:
if first in ("Hydrogen", "hydrogen"):
for Weight in reader:
if Weight[0] == first:
print Weight[1]这不是最好的代码,但它会返回您想要的值。
发布于 2012-08-09 03:14:39
第一个问题:
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语句,但就是这样。
https://stackoverflow.com/questions/11871323
复制相似问题