2017-03-24 9 views
-1

私は必要なファイルを含むフォルダで実行するとうまく動作するpythonスクリプトを持っています。しかし、スクリプトを変更して各サブフォルダに移動し、サブフォルダごとにファイルを使用し、各サブフォルダに出力ファイルを書き込む必要があります。 os.walkなどについて読んだことがありますが、os.walkが動作するスクリプトをどのように変更するのか分かりません。私を助けてください。Python;すべてのサブフォルダでsciptを実行してください

d1 = {} 
with open('genes.gff.genespercontig.csv', 'r') as f: 
for line in f: 
     tok = line.split() 
     d1[tok[1]] = int(float(tok[0])) 

d2 = {} 
with open('hmmer.analyze.txt.result.txt', 'r') as f2: 
    for line in f2: 
     tak = line.split() 
     d2[tak[1]] = int(float(tak[0])) 

from itertools import chain 
from collections import defaultdict 
d3 = defaultdict(list) 
for k, v in chain(d1.items(), d2.items()): 
    d3[k].append(v) 

import csv  
with open('output_contigsvsgenes.csv', 'w') as f: 
    writer = csv.writer(f)  
    for k,v in d3.items(): 
     writer.writerow([k] + v) 

答えて

3

あなたが読みしようとしている各ファイルは、ツリー内の各ディレクトリで利用できるようになりますことを知っているなら、あなたは、単にos.walkブロックであなたの現在のスクリプトをラップすることができます: スクリプトは、アルは、以下であります:

import os 

for root, dirs, files in os.walk('.'): 
    d1 = {} 
    with open(os.path.join(root, 'genes.gff.genespercontig.csv'), 'r') as f: 
     for line in f: 
      tok = line.split() 
      d1[tok[1]] = int(float(tok[0])) 

    d2 = {} 
    with open(os.path.join(root, 'hmmer.analyze.txt.result.txt'), 'r') as f2: 
     for line in f2: 
      tak = line.split() 
      d2[tak[1]] = int(float(tak[0])) 

    from itertools import chain 
    from collections import defaultdict 
    d3 = defaultdict(list) 
    for k, v in chain(d1.items(), d2.items()): 
     d3[k].append(v) 

    import csv 
    with open(os.path.join(root, 'output_contigsvsgenes.csv'), 'w') as f: 
     writer = csv.writer(f) 
     for k,v in d3.items(): 
      writer.writerow([k] + v) 

そうしないと、探しているファイルが存在しない場合があります。それはあなたがあなたの出力を作成するために、両方のファイルからの値を必要とすることが表示されますので、tryブロックで全体の事をラップするために、おそらく大丈夫です:

import os 

for root, dirs, files in os.walk('.'): 
    try: 
     d1 = {} 
     with open(os.path.join(root, 'genes.gff.genespercontig.csv'), 'r') as f: 
      for line in f: 
       tok = line.split() 
       d1[tok[1]] = int(float(tok[0])) 

     d2 = {} 
     with open(os.path.join(root, 'hmmer.analyze.txt.result.txt'), 'r') as f2: 
      for line in f2: 
       tak = line.split() 
       d2[tak[1]] = int(float(tak[0])) 

     from itertools import chain 
     from collections import defaultdict 
     d3 = defaultdict(list) 
     for k, v in chain(d1.items(), d2.items()): 
      d3[k].append(v) 

     import csv 
     with open(os.path.join(root, 'output_contigsvsgenes.csv'), 'w') as f: 
      writer = csv.writer(f) 
      for k,v in d3.items(): 
       writer.writerow([k] + v) 
    except: 
     print traceback.format_exc() 

あなたが個別に個々のファイルを処理する場合は、あなたが変更することができます1つのファイルが存在するが、他のファイルは存在しない場合を処理する。

+0

ご協力いただきありがとうございますが、これを試してみると、次のエラーが表示されます。IOError:[Errno 2]このようなファイルやディレクトリはありません: './genes.gff.genespercontig.csv'。私はファイルが各サブディレクトリにあることを確信していますが、スクリプトがそれらを見つけることができないようです。 – Gravel

+0

名前のエラーだけでなく、すべてのエラーをキャッチするために2番目の例を編集しました。うまくいけば、それはそれを処理する必要があります。ファイルがあると確信できても、ファイルが見つからない場合は、files変数を実際に存在することを確認してみてください。 – WillySchu

+0

申し訳ありませんが、2番目の例でも同じエラーが返されます – Gravel

関連する問題