2012-03-21 3 views
1

私の目的は、小さなcsvファイル(1列、数百行)で値を検索することです。 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)) 

を行うときに、あなたのプログラムを簡素化することができ、いくつかの方法があります。それを使用しますが、あなただけの代わりに、第1の長さを見つけることを試みるのforループの後

length_list = len(value) 

をすれば、それは動作するはずです。

、あなたのプログラムを簡素化することができる方法の例:

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"を掘り下げませんでした。 –

+0

@BrandonDorrisこの場合、 'with'ステートメントはファイルを自動的に閉じます。その例の主なポイントは 'return'部分で、ファイルに行が非常に簡単に存在するかどうかをテストする方法を示しています。 Pythonにはイテレータであるオブジェクトがたくさんあるので、それらを偶発的に消費するという問題に直面する可能性があります。 – agf

0

私はこのような何かしたい:これは一度CSVを通して見る

# 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 

を、各行の最初の値を変換し、変換されたfloatがdesired_valueと一致する場合は、行番号と一致する値を出力します。

のtest.CSV:

10
20
1000
1500

出力:最初

2 1000

関連する問題