2017-08-04 59 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