2016-04-25 6 views
1

私は14000を超えるfastaファイルを持っています.5シーケンスを含むものだけを残したいと思います。私は、単一のFASTAファイル内の列の数を取得するには、次のbashコマンドを使用することができます知っている:ファイルにfastaシーケンスの数を書き込むためにpython subprocess.callを使用する

grep -c "^>" filename.fasta 

だから、私のアプローチは、テキストファイルに各ファイル内のシーケンスのファイル名と数を書くことでしたそれから私が望むシーケンスだけを分離するために使用することができます。非常に多くのファイルに対してgrepコマンドを実行するには、私はsubprocess.callを使用しています:

import subprocess 
import os 


with open("five_seqs.txt", "w") as f: 
    for file in os.listdir("/Users/vivaksoni1/Downloads/DA_CDS/fasta_files"): 
     f.write(file), 
     subprocess.call(["grep", "-c", "^>", file], stdout = f) 

私の問題の一部は、grepコマンドは「^>」ですが、サブプロセスは、独自の引用符を持つように各引数を必要とすることです。基本的に引数として入力する場合は、 "^>"を使用することができます: ""> "" "。

また、f.write( "\ n")をf.write(ファイル)の後に追加する必要がありますか?現在のところ、私の出力は、各エントリが隣り合っている単なるテキストファイルです。サブプロセスコマンドは、各ファイル名を端末に出力し、ファイルが見つからないと述べます。

grep:MZ23900789.fasta:ディレクトリ

+0

あなたは 'subprocess.call()'で 'shell = True'を試してみましたか?例: 'subprocess.call([" grep "、" -c "、" ^> "、file]、stdout = f、shell = True)' –

+0

こんにちは、私は残念なことにこれを試してみました。 grepコマンドはまだファイルに書き込まれていないので、各ファイルのターミナルにこの出力が表示されます。grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C [num]] \t [-eパターン] [-fファイル] [ - バイナリファイル=値] [ - カラー= when] \t [--context [= num]] [--directories = action] [--label] [--line-buffered] \t [--null] [パターン] [ファイル...] – spiral01

+0

ファイルを取得してテストするだけです: 'grep -c '^>' fasta_file' ..それは動作しますか? 'subprocess.call(" "grep"、 "-c"、 "'^>'"、ファイル)、stdout = f、shell = True) 'そうでなければ、何か間違っています。毎ターンに電話してください。 'pdb'はあなたの友人です - ' ipdb'はあなたの最高の友達です –

答えて

2

次のコードを試してください。ファイル名とタブ区切り文字とシーケンス数(つまり>文字)を書き込みます。 Popencommunicateを使用すると、出力を処理する際の柔軟性が向上します。 Ubuntuでテストされています。

import subprocess 
import os 

fasta_dir = "/Users/vivaksoni1/Downloads/DA_CDS/fasta_files/" 

with open("five_seqs.txt", "w") as f: 
    for file in os.listdir(fasta_dir): 
     f.write(file + '\t') 
     grep = subprocess.Popen(["grep", "-c", "^>", fasta_dir + file], stdout = subprocess.PIPE) 
     out, err = grep.communicate() 
     f.write(out + '\n') 
+0

これは完璧に動作します。どうもありがとう。 – spiral01

関連する問題