2012-08-08 49 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