2016-11-11 8 views
0

は、私は以下のようにPythonスクリプトを持っている:異なるファイルのループとしてPythonスクリプトを実行するにはどうすればいいですか?

#!/usr/bin/python 
from Bio import SeqIO 

fasta_file = "input.fa" # Input fasta file 
wanted_file = "A_ids.txt" # Input interesting sequence IDs, one per line 
result_file = "A.fasta" # Output fasta file 

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") 

私はしかし、40種類のwanted_filesため、同じ入力ファイルに対して上記のスクリプトを実行したい - A_ids.txt、B_ids.txt、など - 異なる名前で。 そして私は彼らのそれぞれの異なる出力 - A.fasta、B.fastaなどを持っています。

私のpythonスクリプトを変更する必要がありますか、私はすべての私の望むファイルのためにそれを実行するためにループを作成する必要があります?

ありがとう

+1

次のことが可能確かにすべての入力ファイルとそれに対応する出力のリストを作り、それをループしてください。これが繰り返すと予想されるプロセスであれば、ファイルからファイル名を読み込み、出力ファイル名を作成する関数を記述するようにスクリプトを変更することは価値があるかもしれません。 – hoyland

答えて

3

私は@BlackVegetableに同意します。そして、あなたはあなたのケースでは、python input.fa A_ids.txt A.fastaでプログラムを呼び出すことができ

#!/usr/bin/python 
from Bio import SeqIO 

import sys # for sys.argv 

fasta_file = sys.argv[1] # This is now going to be name.fa, the fasta file 
wanted_file = sys.argv[2] # This is now going to be name_ids.txt, or whatever you passed 
# as an argument 
result_file = sys.argv[3] # Output fasta file, now passed as arg 

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") 

:このような何かを行うことによって、コマンドライン引数を使用するように設定してください。または、python inputB.fa B_ids.txt B.fasta

+0

これはargparseよりも軽量で、おそらくOPに適しています。また、役に立つ具体的なアプリケーションを提供しました。 +1 – BlackVegetable

+0

栄光XD – SolarPixelGaming

+0

を盗むための@BlackVegetable私の謝罪ありがとうございますが、この場合は40回コマンドを実行する必要があります...ありがとう! – Paul

0

このプログラムでコマンドラインオプションを使用することを検討してください。これにより、コマンドラインからwanted_fileという名前を引数として読み取ることができ、与えられた引数を解析し、パターンに従う(例えば、.fastaで与えられた拡張子を置き換えるなど)、または出力パターンを別のコマンドにすることによって、ある種の行引数。

あなたのプログラムをpython my_script.py A_ids.txtと呼び、それをbash経由でループすることができます。引数の数を可変にすることもできます。それぞれの引数は、指定された名前のロジックを呼び出します。

あなたのPythonバージョンによっては、コマンドライン引数を扱うのがhttps://docs.python.org/3.3/library/argparse.htmlhttps://docs.python.org/2/library/argparse.htmlです。あなたがwanted_fileのために単一のコマンドライン引数を使用してのパスを取る場合

(また、あなたは、単に出力printまたは類似の機能を経由してstdoutの内容とはに出力を送信するには、コマンドラインでリダイレクト演算子を使用することができますファイル名はpython my_script.py A_ids.txt > A.fasta

0
私は簡単な方法は、(コードで: wanted_filenames_file)ファイル内の40個のファイル名を格納することができると思い

ファイルの各1に沿って、配列(wanted_files)に保存し、ループ:

# !/usr/bin/python 
from Bio import SeqIO 

fasta_file = "input.fa" # Input fasta file 
wanted_filenames_file = "filenames.txt" 
with open(wanted_filenames_file) as f: 
    wanted_files = f.readlines() 
result_file = [] # Output fasta file 
for wanted_file in wanted_files: 
    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') 
    result_file = wanted_file.replace("_ids.txt", ".fasta") 
    with open(result_file, "w") as f: 
     for seq in fasta_sequences: 
      if seq.id in wanted: 
       SeqIO.write([seq], f, "fasta") 
+0

動作しませんでした。私は望むファイルのすべてのファイル名(filenames.txt)を持つファイルを作成します。私はいくつかのエラーがあります:/ var/mail/Bioを読むことができません ./modified.py:行4:fasta_file:コマンドが見つかりません ./modified.py:行5:wanted_filenames_file:コマンドが見つかりません ./ modified.py:行6:予期しないトークンの近くで構文エラーが発生しました '( ' ./modified。py:行6: 'open(wanted_filenames_file)をfとして: ' – Paul

+0

@Clarissaは同時に3つのエラーが発生していますか?私はそれをはっきりと説明していないと思う。 'filenames.txt'という名前のファイルを作成しなければなりません。ここでは、すべてのファイル名を1行に1つずつ保存する必要があります。 –

+0

はい私はそれをしました。私はfilenames.txtという名前のファイルを、1行に1つずつすべてのファイル名で作成しました。 – Paul

関連する問題