2011-06-28 20 views
0

私はPythonで非常に初心者です。私は、不変のcsvファイルを持ってここに例があります(私はPythonのコンソール内の行でそれを印刷)Pythonでcsvの項目を見つける手助け

['george', 'williams', '277389', 'susan thompson', '2042228888'] 
['john', 'smith', '833999', 'george smith', '2041118833'] 
['michael', 'jackson', '281038', 'ronald jackson', '2041128493'] 

これらは

['firstname', 'lastname', 'idnumber', 'emergency contact', 'emerg contact ph'] 

フィールドのタイトルです私はIDを入力できるようにする必要がありますnumberは、csvを介して検索を開始し、個人のファーストネーム、姓、緊急連絡先、電話番号を出力します。何かご意見は?どこから始めればいいのですか?つまり、csvの内容をdictに読み込んでください。

+2

の場合あなたは単純な 'grep 277389 file.csv'を使うだけで十分でしょう。 – miku

答えて

0

idを取得するには、raw_inputを使用してください。

あなたは文の場合は、idが一致する場合、それは見るために使用する必要があり:

ラインが['george', 'williams', '277389', 'susan thompson', '2042228888']

if line[2] == id: 
    for x in line: 
     if not x == line[2]: 
      print x 

であることがお役に立てば幸い!

3

私は個人的には辞書となるだろう:

records = [ 
    ['george', 'williams', '277389', 'susan thompson', '2042228888'], 
    ['john', 'smith', '833999', 'george smith', '2041118833'], 
    ['michael', 'jackson', '281038', 'ronald jackson', '2041128493'], 
    ] 

from operator import itemgetter 
recordsbyid = dict(zip(map(itemgetter(2),records),records)) 

、あなたは

>>> recordsbyid['277389'] 
['george', 'williams', '277389', 'susan thompson', '2042228888'] 

itemgetterを行うことができますがmapがすべてのレコードに適用され、第二の要素(id)を選択し、zipは、IDSを連結(id、record)で構成されるタプルのリストに記録します。 dictはこれを辞書に変換します。

0

フィールドタイトルをキーとして使用し、フィールドデータを値として使用して、各行を最初に作成しましょう。各キーと値のペアは、2つのリストを一緒に「圧縮」することによって取得します。dict(zip(field_titles, row))。リスト内包表記を使用して、入力行のリストからこれらのdictsのリストを作成することができます:[dict(zip(field_titles, row)) for row in data]

id_numberでこれらを見ることができるようにするため、キーがidnumberで、値が行dictであるdictを作成します。私たちはrow_dict:dict((row_dict['id_number'], row_dict) for row_dict in data)でそれを見てidnumberを得ることができます。

0

私はsqliteに、このCSVファイルを変換し、クエリを使用します。

SELECT * FROM data WHERE idnumber = %s

私はDBに編成されたデータでの作業が好き、それはあなたが将来的にはより多くの利点(より洗練されたクエリを)持って来るかもしれません。

cvsをsqliteおよびテストクエリに変換するには、SQLite Manager addon for Firefoxを使用します。

0

ファイルをスキャンし、一度だけ必要な行を検索する必要がある場合は、あなたが辞書にすべてのデータを変換する必要はありません - あなたはあなたの行を見つけるまでちょうどラインを一つずつ読み:

import csv 

def find_row_by_id(filename, key_column, id): 
    with f = open(filename, 'rb'): 
     my_reader = csv.reader(f) 
     for row in my_reader: 
      if row[key_column] == id: 
       return row 
    raise Error("Could not find row") 

print find_by_row('eggs.csv', 2, my_id) # my_id should by a string 

ファイルが小さく、idだけで複数の検索を行う必要がある場合は、他の回答が示唆するように辞書に変換してください。一方

、あなたのファイルは非常に(非常に)大であり、あなたが最初のキーと値のデータベースにあなたのcsvファイルを読み、速いルックアップおよび/または多くのルックアップを行う必要がある場合:Reliable and efficient key--value database for Linux?

関連する問題