2016-04-12 11 views
1

.csvファイルでSSIDのリストをフィルタリングし、フィルタ処理した結果を別のファイルに書き込むより効率的な方法を見つけようとしています。forループをPythonの文字列のセットを使ってフィルタを作成する

現在、私が持っているコードは次のようになります(そして、それが期待通りに動作します):

def ssidFilter(): 

    File = open("/home/pi/unFilter.csv", "r") 
    for line in File: 
     if 'Test SSID' in line: 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line)) 
     if 'Public' in line: 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line)) 
     if 'HomeNet' in line: 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line)) 
     if 'Network 1' in line: 
      with open("/home/pi/gpsMaster/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line)) 
     if 'LimeOak' in line: 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line)) 
     if 'BlackCrow' in line: 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line)) 
     if 'GuestWiFi' in line: 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
          finalFile.write(str(line))         
    File.close() 

しかし、私は個別のSSIDのそれぞれによって実行されていないソリューションを使用したいと思います。 Idはリストを使用してそれを反復するのが好きです。私は今朝のzip関数に関する質問をしましたが、コードのこの部分では機能しませんでした。私は(働いていない)に取り組んできました

SSID = ['Test SSID' , 'Public' , '....etc...'] 
File = open("/home/pi/unFilter/csv" , "r") 
for line in File: 
    if SSID in line: 
     with open("/home/pi/dataLog.csv", "a") as finalFile: 
      finalFile.write(str(line)) 
File.close()        

は、このの出力は時にエラーを生成は、「SSID場合行に:」TypeError例外「として:左のように 『中』の文字列が必要ですオペランド、リストではありません。

「SSIDの場合」を「if str(SSID)」に置き換えるとエラーは発生しませんが、何も返されず、個々の要素ではなく文字列全体を検索しているためです。

私はそれを正しく使用している場合は、zipファイルを使用しようとすると、そのは、リストをタプルとしてそれを治療していない以外、同じ例外TypeErrorを持っていた

...

File = open('/home/pi/unFilter.csv', 'r') 
for line in File: 
    for new in zip(SSID): 
     if new in line: 
      print line 

は、どのように私はアプローチすべきですこの問題?

答えて

2

あなたは

SSID = ['Test SSID' , 'Public' , '....etc...'] 
with open('/home/pi/unFilter.csv', 'r') as in_file: 
    for line in infile: 
     if any(item in line for item in SSID): 
      with open("/home/pi/dataLog.csv", "a") as finalFile: 
       finalFile.write(str(line)) 
1

一つの解決策は、(別の答えで説明したように)anyを使用することであるが、場合には、あなたがあなたのからSSIDの 名を解析することができますキーワードを反復処理するanyを使用することができますあなたが興味のある名前のリストにSSID名が見つかりました のメンバシップをテストするだけで、より効率的なソリューションを使用することができます。

次のコードでは、get_ssid関数を使用して、SSID名を行から取得しようとしています。

SSID名を持つので、テストははるかに簡単で高速です。

def ssidFilter(ssids_to_log, input_csv, output_csv): 
    def get_ssid(line): 
     # parse SSID from the line, return it 
     # Here I assume it is first part of the line, delimited by ; 
     return line.split(";", 1)[0] 

    with open(input_csv) as in_f: 
     with open(output_csv, "a") as out_f: 
      for line in in_f: 
       if get_ssid(line) in ssids_to_log: 
        out_f.write(str(line)) 

if __name__ == "__main__": 
    ssids_to_log = ["Test SSID", "Public", "HomeNet", "Network 1", 
        "LimeOak", "BlackCrow", "GuestWiFi"] 
    input_csv = "/home/pi/unFilter.csv" 
    output_csv = "/home/pi/dataLog.csv" 
    ssidFilter(ssids_to_log, input_csv, output_csv) 
関連する問題