2012-03-21 20 views
1

我的目標是爲一個值搜索一個小的csv文件(一列,幾百行)。 csv中的行都是數字。這裏是我的嘗試:您可以使用Python搜索csv的值嗎?

import csv 

#read csv file 
csv_reader = csv.reader(open('test.csv', 'rU')) 

length_list = len(list(csv_reader)) 
value = [] 

for line in csv_reader: 
    value.append(line) #transfer contents of csv to list 

def find_voucher(input_voucher, counter): 
    while counter < length_list: 
     check_voucher = input_voucher in value[counter] 
     if check_voucher == True: 
      print "TRUE" 
     else: 
      print "FALSE" 
    counter = counter + 1 
find_voucher(1000,1) 

當我運行該腳本,我得到這個錯誤:

check_voucher = input_voucher in value[counter] 
IndexError: list index out of range 

回答

4

csv.reader是一個迭代 - 你通過它去一次後,它是空的,不像list。您可以使用它,當你這樣做

length_list = len(list(csv_reader)) 

有多種方式,你可以簡化你的程序,但如果你只是做

length_list = len(value) 

for循環,而不是試圖先找到後長度,它應該工作。

的你怎麼可以簡化你的程序的一個例子:

def find_voucher(input_voucher, filename): 
    with open(filename, 'rU') as f: 
     return ("%s\n" % input_voucher) in f 

print find_voucher(1000, 'test.csv') 
+0

首先第一件事情:你的簡化腳本完美。我對python仍然很陌生,我沒有深入研究「with」。 – 2012-03-23 01:50:33

+0

@BrandonDorris在這種情況下,'with'語句會自動關閉文件。這個例子的主要觀點是'return'部分,向您展示如何非常容易地測試文件中是否存在行。 Python中有很多對象是迭代器,所以你可能會碰到再次意外消耗它們的問題。 – agf 2012-03-23 02:23:32

0

我會做這樣的事情:

# value we're looking for 
desired_value = 1000 

# read csv file 
csv_reader = csv.reader(open('test.csv', 'rU')) 

# loop through csv file 
for line_number, line in enumerate(csv_reader): 
    # catch errors in converting to float 
    try: 
     # if desired matches first value on line 
     if desired_value == float(line[0]): 
      # print line number and value 
      print line_number, line[0] 
    except ValueError as e: 
     continue 

這看起來通過CSV一次,第一個值轉換,每行浮動,然後如果轉換後的float與desired_value匹配,則打印行號和匹配的值。

Test.csv:

10
20
1000
1500

輸出:

2 1000

相關問題