2017-08-28 4 views
0

私は非常にPythonに新しく、特定のファイル(input1.txt)に対して実行するPythonスクリプトを持っていて、出力(output1.fasta)を生成しましたが、例えば複数のファイル、このスクリプトを実行する:input2.txt、input3.txt ...と、それぞれの出力を生成:output2.fastaを、複数の入力ファイルに対して実行するPythonスクリプトを変更します

from Bio import SeqIO 

fasta_file = "sequences.txt" 
wanted_file = "input1.txt" 
result_file = "output1.fasta" 

wanted = set() 
with open(wanted_file) as f: 
    for line in f: 
     line = line.strip() 
     if line != "": 
      wanted.add(line) 
fasta_sequences = SeqIO.parse(open(fasta_file),'fasta') 
with open(result_file, "w") as f: 
    for seq in fasta_sequences: 
     if seq.id in wanted: 
      SeqIO.write([seq], f, "fasta") 

output3.fasta私はglob関数を追加しようとしましたが、私は出力ファイル名をどう扱うべきかわかりません。

from Bio import SeqIO 
import glob 

fasta_file = "sequences.txt" 

for filename in glob.glob('*.txt'): 

    wanted = set() 
    with open(filename) as f: 
     for line in f: 
      line = line.strip() 
      if line != "": 
       wanted.add(line) 

    fasta_sequences = SeqIO.parse(open(fasta_file),'fasta') 
    with open(result_file, "w") as f: 
     for seq in fasta_sequences: 
      if seq.id in wanted: 
       SeqIO.write([seq], f, "fasta") 

エラーメッセージは次のとおりです。NameError:名「result_file」が*.txtsequences.txtファイルが含まれているため

+1

正確には動作しません。 globで試した後にコードを表示できますか? – Verv

+1

globで動作しないのは何ですか?私たちが助けることができるように具体的にする。 – kabanus

+0

申し訳ありませんが、エラーメッセージなどで質問を更新しました。 – Paul

答えて

2

あなたglobは現在、あなたの「配列」のファイルだけでなく、入力を引っ張っている定義されていません。 「FASTA」ファイルは常に同じであり、あなたが唯一の入力ファイルを反復処理したい場合は、あなたの全体のプロセスを反復処理するために、また

for filename in glob.glob('input*.txt'): 

を必要とする、おそらくあなたは、メソッドの中でそれを載せていきたいと思います。出力ファイル名が常に入力に対応するように作成されていれば、それを動的に作成することができます。

from Bio import SeqIO 

def create_fasta_outputs(fasta_file, wanted_file): 
    result_file = wanted_file.replace("input","output").replace(".txt",".fasta") 

    wanted = set() 
    with open(wanted_file) as f: 
     for line in f: 
      line = line.strip() 
      if line != "": 
       wanted.add(line) 
    fasta_sequences = SeqIO.parse(open(fasta_file),'fasta') 
    with open(result_file, "w") as f: 
     for seq in fasta_sequences: 
      if seq.id in wanted: 
       SeqIO.write([seq], f, "fasta") 

fasta_file = "sequences.txt" 
for wanted_file in glob.glob('input*.txt'): 
    create_fasta_outputs(fasta_file, wanted_file) 
+0

はいmy fasta_file = "sequences.txt"はすべての入力ファイルで同じです。コマンドはエラーなしで実行されていますが、出力が作成されていません。 – Paul

+0

'sequences.txt'ファイルと' input1.txt'ファイルのサンプルデータがありますか?スクリプトが実行されたので、 'if line!=" ":'や 'if seq.id in wanted:'のようなあなたのロジックの中には、出力が不足している可能性があります。 – jack6e

+0

あなたは正しいです、私のせいです。コマンドは実行中です!どうもありがとう。 – Paul

関連する問題