2017-08-04 60 views
1

我有一個腳本,排序FASTA序列,按字母順序>字符串。這裏是一個與單個輸入文件一起工作的代碼的例子35.fas。 FASTA文件的如何爲許多文件運行python腳本?

import os, sys 
import argparse 
from Bio import SeqIO 

records = list(SeqIO.parse("35.fas", "fasta")) 
records.sort(key=lambda x : x.id) 
SeqIO.write(records, "35-sorted.fas", "fasta") 

例子:

>BAR 
ATCG 
>ABC 
TCGA 

正確的輸出:

>ABC 
TCGA 
>BAR 
ATCG 

所以,我想嘗試一下本作數百個文件,並試圖 'sys.argv中',但並沒有能夠這樣做。我不希望每個文件都有不同的輸出名稱作爲* -sorted。只想運行該腳本並對擴展名爲.fas的文件夾中的所有文件進行排序。 這裏是代碼不工作:

records = list(SeqIO.parse("sys.argv[0]", "fasta")) 
records.sort(key=lambda x : x.id) 
SeqIO.write(records, "sys.arg[0]-sorted.fas", "fasta") 
+0

' sys.argv'可能會被需要。你能證明你是如何嘗試使用它的嗎?你在使用什麼操作系統?如果您有數百個文件,則問題可能是命令行長度的限制。您可能需要指定目錄並讓Python代碼從中獲取文件。 – pcarter

+0

我將代碼添加到問題中,並使用macOS。謝謝 – Ramon

回答

2

你可能被錯誤使用sys.argv,它是所有的命令行參數的數組,其中第一個是文件被運行本身,例如看以下:

import sys 
for f in sys.argv: 
    print(f) 

當你拖動文件a.txt中,b.txt和c.txt到腳本,將打印以下(以...爲完整路徑的省略):

.../a.txt

.../b.txt

.../c.txt

您可以實現到腳本此爲:

import os, sys 
import argparse 
from Bio import SeqIO 

for f in sys.argv[1:]: 
    records = list(SeqIO.parse(f, "fasta")) 
    records.sort(key=lambda x : x.id) 
    SeqIO.write(records, f[:-4] + "-sorted.fas", "fasta") 
1

這是相當容易與for遍歷迭代中sys.argv所有的文件名(應忽略中的第一項,這是程序名)。然後,您會留下產生輸出文件名的問題。爲了爭辯,我假設所有文件名以'.fas'結尾。如果情況並非如此,那麼字符串操作就會有點小技巧,但不會太糟糕。

import os, sys 
import argparse 
from Bio import SeqIO 

for filename in sys.argv[1:]: 
    records = list(SeqIO.parse(filename, "fasta")) 
    records.sort(key=lambda x : x.id) 
    outname = filename[:-4]+'-sorted.fas' 
    SeqIO.write(records, outname, "fasta") 

假設這個計劃被稱爲myprog.py(和你是不是在Windows上,這可能需要您使用glob.glob功能擴展通配符名稱),然後你會這樣稱呼它

python myprog.py *.fas 
+0

謝謝。它給語法錯誤!記錄=清單(SeqIO.parse(文件名「,」fasta「)) ^ SyntaxError:無效的語法 – Ramon

+1

刪除不需要的報價末尾的文件名 – peterjc

+0

謝謝指出我的錯字!誦讀困難的痛苦... – holdenweb

相關問題