2017-07-31 9 views
0

キーワードを含む入力ファイルがあり、それらのキーワードでフィルタリングする必要があるCSVファイルがあります。2つのファイルを読み込み、最初のファイルの列に基づいて2番目のファイルをフィルタリングします

ここでは、Pythonを使用してタスクを自動化しようとしています。

import csv 
with open('Input.txt', 'rb') as InputFile: 
    with open('28JUL2017.csv', 'rb') as CM_File: 
     read_Input=csv.reader(InputFile) 
     for row1 in csv.reader(InputFile): 
      #print row1 

      read_CM=csv.reader(CM_File) 
      next(read_CM, None) 
      for row2 in csv.reader(CM_File): 
       #print row2 
       if row1[0] == row2[0] : 

        Output= row2[0]+","+row2[1]+","+row2[5]+","+row2[6] 
        print Output 

フィルタリングするファイルの最初の行を取得します。いろいろ試しましたが、どこが間違っているのか理解できませんでした。間違いを私に指摘してください。

+1

あなたは巻き戻し(または閉じると再度開く)する必要があり、それを読み取るために 'CM_File' 'csv.reader'で複数回使用します。一度にすべてのキーワードを読み込んで 'set'を作成し、' CM_File'を一度読んで、各行にキーワードのうちどれが読み込まれているのかを確認する方が効率的です。 – martineau

+0

ファイルのデータが複数回必要な場合は、そのすべてを数回解析できる文字列またはリストに読み込みます。ファイルオブジェクトは渡されるべき鳩のようではありません。あなたのロジックは、1)最初のファイルを読む2)最初のファイルを閉じる3)2番目のファイルを読む4)最初のファイルのデータと2番目のファイルのデータを比較する5)2番目のファイルにする6)閉じる2番目のファイル。 –

答えて

1

read_Inputおよびread_CMは本質的にイテレータです。一度ループすれば、2回繰り返すことはできません。あなたがあなたのやり方を強く求めているのであれば、新しいループを開始してCSVファイルを "再読み込み"するたびに、ファイルの先頭に巻き戻す必要があります。ここでは修正プログラムは次のとおりです。これに代えて

import csv 
with open('file1.csv', 'rb') as InputFile: 
    with open('file2.csv', 'rb') as CM_File: 
     read_Input=csv.reader(InputFile) 
     for row1 in csv.reader(InputFile): 
      CM_File.seek(0) # rewind to the beginning of the file 
      read_CM=csv.reader(CM_File) 
      next(read_CM, None) 
      for row2 in csv.reader(CM_File): 
       if row1[0] == row2[0] : 
        Output= row2[0]+","+row2[1]+","+row2[5]+","+row2[6] 
        print Output 

、私はすでにラインの代わりに、再読み込みファイルを読み取る以上、あなたがループを示唆しています。また、代わりに「キーワード」のリストを作成し、ネストされたループを有し、単にrow2[0]がそのリストになっていることを確認する:

import csv 
with open('file1.csv', 'rb') as InputFile: 
    with open('file2.csv', 'rb') as CM_File: 
     read_Input = csv.reader(InputFile) # read file only once 
     keywords = [rec[0] for rec in read_Input] 
     read_CM = csv.reader(CM_File) # read file only once 
     next(read_CM, None) # not sure why you do this? to skip first line? 
     for row2 in read_CM: 
      if row2[0] in keywords: 
       Output = row2[0]+","+row2[1]+","+row2[5]+","+row2[6] 
       print("Output: {}".format(Output)) 
+0

あなたが提案した変更を加えると結果は0になりました。私が手に入れていた最初の列もまた消えました。私はいくつかのサンプルデータを追加すると役立つでしょうか? – user3017186

+0

もちろん、いくつかのデータは間違いなく役に立ちます。期待された結果もどちらも害を与えません。 –

+0

@ user3017186 2つのテストファイルを使用したテストに基づいて回答を編集しました。 –

関連する問題