2016-12-05 6 views
0

単純なPythonコード(私はPythonの初心者です)から正しい結果を得ようとしました。 与えられるCSV入力ファイル(ListInput.csv): PKT、PET、PUT、csvコンテンツPythonのリストelmentsによるフィルタリング

これらの要素(Table.csv)の多くの特徴を含む別のCSVファイル:

pBR,156,AATGGT,673,HHHTTTT, 
pUT,54,CCATGTACCTAT,187,PRPTP, 
pHTM,164,GGTATAG,971,WYT, 
pKT,12,GCATACAGGAC,349,, 
pET,87,GTGACGGTA,506,PPMK, 

.. ..........など

私は、出力(WorkList.txt)としてcsvファイルを取得するために、最初のcsvファイル要素に基づいて選択を得ることを目指しています。この場合は期待されています結果は次のようになります。

pKT,12,GCATACAGGAC,349,, 
pET,87,GTGACGGTA,506,PPMK, 
pUT,54,CCATGTACCTAT,187,PRPTP, 

私はエラーを出さないが出力として空のファイルで終わる次のスクリプトを書いた。私は何日も成功しなかった理由を理解しようとしています。どんな助けでも大歓迎です。

#!/usr/bin/python 
import csv 

v = open('ListInput.csv', 'rt') 
csv_v = csv.reader(v) 

vt = open('Table.csv', 'rt') 
csv_vt = csv.reader(vt) 

with open("WorkingList.txt", "a+t") as myfile: 
    pass 


for el in csv_v: 
    for var in csv_vt: 
     if el == var[0]: 
      myfile.write(var) 

myfile.close() 

答えて

2

まず問題:

あなたは最初の反復であなたの入力のcsvイテレータcsv_vtを消費します。

vt.seek(0) 

ファイルを内側ループ用に巻き戻すには、次の操作を行います。これはO(n^2)の検索アルゴリズムを残しますが、少なくとも動作します。

第二の問題:

あなたはwithブロックで&決算my_fileを開いています。 forループに到達すると、withブロックを脱出したためにmy_fileがすでに閉じられています(これはwithブロックの保証です)。

出力を書き込もうとすると、最初の問題はありませんでした。

withブロック内の最後の部分を書き換えて、close()を削除します。あなたは、ファイルにリストを書き込むことはできません

第3の問題は、あなたが最初にcsv.writerオブジェクトを作成する必要があります。

ので、それをまとめるために、あなたはすべての問題を解決することができ、プラス次のコードでパフォーマンスの問題:

#!/usr/bin/python 
import csv 

v = open('ListInput.csv', 'rt') 
csv_v = csv.reader(v) 

with open('Table.csv', 'rt') as vt: 
    csv_vt = csv.reader(vt) 
    # create a dictionary to speed up lookup 
    # read the table only once 
    vdict = {var[0]:var for var in csv_vt} 

with open("WorkingList.txt", newline="") as myfile: # for Python 3.x 
## with open("WorkingList.txt", "wb") as myfile: # for Python 2 
    cw = csv.writer(myfile) 
    for el in csv_v: 
     if el[0] in vdict: 
      cw.writerow(vdict[el]) 

v.close() 

vdictは「キーが」であれば、あなたの内側のループを置き換えるルックアップテーブルは(唯一の作品です一意ではありません。入力サンプルの場合のようです)

+0

right!あなたのミスを私の最終的なコードにコピーしたからです。私の編集 '最初の列が辞書に入っているかどうかを確認するには、' vdict: 'の中でel [0] ifを参照してください。 –

+0

あなたの残っていないコードの残りの部分が修正されました。 csv.writerを使用する必要があります。 –

+0

申し訳ありません。テストのないコーディングが原因です。代わりに 'writerow'が必要です。 –

0

解決済み!以下は、動作するコードの一部です:

import csv 

with open('ListInput.csv', 'rt') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter=',') 
    vinput = [] 
    flist = [] 
    for row in readCSV: 
     vi = row 
     vinput.append(vi) 

     print(vinput) 

with open('Table.csv', 'rt') as csvfile: 
    readTable = csv.reader(csvfile, delimiter=',') 
    vtable = [] 
    for row in readTable: 
     vt = row 
     for rig in vi: 
      el = rig 
      if str(el) in vt: 
       vtable.append(vt) 


    print(vtable)   

with open (r'WorkingTable.csv', 'w', newline='') as write_file: 
    write=csv.writer(write_file) 
    write.writerows([r] for r in vtable) 
関連する問題