2012-09-14 35 views
1

無法找到一個答案的解決方案,所以一旦我想通了,我想我會重新發布我的解決方案...的Python:使用變量作爲CSV查找引用和返回值

我正在尋找一種獲取用戶輸入(sys.argv[1])的方法,並使用此值在CSV文件中查找列x中的另一個值(例如5)。這將是一個更大的腳本的一部分,我會使用查找的值作爲測試。

我的例子CSV是:

col0,col1,col2,col3,col4 
a,foo,bar,blah,1 
b,foo,bar,blah,2 
c,foo,bar,blah,3 
d,foo,bar,blah,4 
e,foo,bar,blah,5 
f,foo,bar,blah,6 
g,foo,bar,blah,7 
h,foo,bar,blah,8 
i,foo,bar,blah,9 
j,foo,bar,blah,10 
k,foo,bar,blah,11 
l,foo,bar,blah,12 
m,foo,bar,blah,13 
n,foo,bar,blah,14 
o,foo,bar,blah,15 
p,foo,bar,blah,16 
q,foo,bar,blah,17 
r,foo,bar,blah,18 
s,foo,bar,blah,19 
t,foo,bar,blah,20 
u,foo,bar,blah,21 
v,foo,bar,blah,22 
w,foo,bar,blah,23 
x,foo,bar,blah,24 
y,foo,bar,blah,25 
z,foo,bar,blah,26 
+2

@esaelPsnoroMoN:就我看來像OP居然張貼了他的自我問題的答案在你面前問他試了什麼(10:47:38 vs 10:49:31)。 – DSM

+0

這是正確的......這是我一直在思考的一段時間,而且事實證明非常簡單。所以我想我會分享,如果有人有改進的建議,我會歡迎他們,我相信別人也會。 : - )_ – MHibbin

+1

@esaelPsnoroMoN:被擊暈! :) –

回答

3

我有一個快速瀏覽你的Javascript問題,如果你只是映射char->在字母表中的位置,以下是什麼?

def char_to_pos(char): 
    from string import ascii_lowercase 
    try: 
     return ascii_lowercase.index(char) + 1 
    except ValueError as e: 
     pass # no match - do what's sensible here 

如果你想預先生成的查詢表,則是這樣的:

from string import ascii_lowercase 
from itertools import count 

lookup = dict(zip(ascii_lowercase, count(1))) 
# or depending on taste 
lookup = {letter: idx for idx, letter in enumerate(ascii_lowercase, start=1)} 

否則,由於CSV文件通常relativey小,你可以只加載整個文件到內存,以避免重複的順序查找後(只要CSV中沒有那麼大它會讓你的機器處於昏迷狀態)

with open('test1.csv') as fin: 
    csvin = csv.reader(fin) 
    lookup = {row[0]: row for row in csvin} 

to_find = 'x' 
try: 
    print '{} = {[4]}'.format(to_find, lookup[to_find]) 
except (KeyError, IndexError) as e: 
    pass # KeyError = no lookup match, IndexError is that CSV file didn't have 5th column... 
+0

這不是JavaScript的項目,這是不同的。我將在CSV中匹配一個字符串(用戶輸入作爲設備模型)並輸出另一個字符串(這可能類似於OS類型)。我喜歡這些信息,因爲我還在學習(所以我會upvote),但是你的第三塊代碼比我的效率更高嗎? - 我以爲我正在將它加載到內存中。 什麼會構成一個大的CSV? – MHibbin

+0

@MHibbin你的代碼創建一個CSV閱讀器對象,並逐行讀取,直到找到一個匹配(它似乎不處理匹配*不*找到的情況);這對於一次性查找來說很好。如果文件很大,並且重複查找,那麼存儲在更合適的數據結構中更合適。這裏的第三個例子加載到一個存儲在RAM中的'dict'中(在大多數計算機系統中,幾百Mb對於經常使用的表格來說不是不合理的),並且使您能夠使用'dict'查找時間)以及更容易處理丟失的鍵/默認值。 –

+0

@MHibbin您可能還想考慮一下,不要使用CSV文件來存儲數據,而應該使用簡單的數據庫,例如Sqlite3,它自2.5開始就是Python stdlib的一部分。這將使您能夠將它保存在磁盤上,但在查找列上維護索引,並在SQL中執行更復雜的查詢(如果需要),而不是使用Python編寫它們'select sum(col4)from your_table where col0 not in(' a','e','i','o','u')group by col4' etc ... –

1

我這樣做是如下的方式:

import sys 
import csv 
#define user input as variable 
input = sys.argv[1] 
# read csv file into "fooReader" 
fooReader = csv.reader(open('test1.csv', 'rb'), delimiter = ',', quotechar="\"") 
# read each row in "fooReader" 
for row in fooReader: 
     # define first row column as "value" for testing 
     value = row[0] 
     # test if value (1st column) is the same as input (user input) 
     if value == input: 
       # ...if it is then print the 5th column in a certain way 
       print value + " = " + row[4] 

這可以被用來分配row[4]在另一個測試所需的變量。