在命令行中将通配符用作sys.argv [2]

时间:2018-07-18 08:34:09

标签: python bash

问题

我正在尝试编写一个脚本,该脚本使用SeqIO将文件类型转换为另一种文件,最好是在我编写的命令行上:

python3 converter.py *.ab1 *.fas

但这不起作用。但是,当我使用以下命令时,效果很好:

python3 converter.py *.ab1 workingexample.fas

我当前的代码

这是我目前的代码。

import sys
from Bio import SeqIO

file = sys.argv[1]
outputfile = sys.argv[2]

with open(file, "rb") as input_handle:
    with open(outputfile, "w") as output_handle:
        sequences = SeqIO.parse(input_handle, "abi")
        count = SeqIO.write(sequences, output_handle, "fasta")

print("Converted %i records" % count)

所需的输出:

修正

python3 converter.py *.ab1 *.fas

这意味着我可以在具有相同扩展名的同一目录中的多个文件上运行此文件,然后输出具有相同名称但转换后的新扩展名的文件。

(我不确定是将其标记为bash问题还是将其标记为python,因此我已将其标记为两者,如果我错了,请纠正我)

2 个答案:

答案 0 :(得分:3)

这样的事情有用吗?

import sys
import glob
import os
from Bio import SeqIO

file = sys.argv[1]
output_extension = sys.argv[2]

for f in glob.glob(file):
    filename, file_extension = os.path.splitext(f)
    outputfile = f.replace(file_extension, output_extension)

    with open(f, "rb") as input_handle:
        with open(outputfile, "w") as output_handle:
            sequences = SeqIO.parse(input_handle, "abi")
            count = SeqIO.write(sequences, output_handle, "fasta")

    print("Converted %i records" % count)

您可以这样称呼它:

python converter.py '*.ab1' .fas

答案 1 :(得分:1)

如果我正确理解,我认为问题是*.ab1与一个文件(至少一个)匹配,而*.fas与任何文件都不匹配。这意味着您的程序将被调用为:

python3 converter.py first.ab1 second.ab1 third.ab1 *.fas

*.fas被传递,未扩展。从此示例可以明显看出,您不能依靠*.fas作为第二个参数-它是 last 参数。

我认为外壳通过扩展glob可以在这里为您提供帮助,并且无需通过例如将参数括在引号中。

我建议您这样调用脚本:

python3 converter.py *.ab1 fas

然后将代码更改为:

import sys
import os.path
from Bio import SeqIO

files = sys.argv[1:-1]
output_ext = sys.argv[-1]

def get_output_filename(input_filename, output_ext):
    root, ext = os.path.splitext(input_filename)
    return "{}.{}".format(root, output_ext)

for in_file in files:
    out_file = get_output_filename(in_file, output_ext)
    with open(in_file, "rb") as input_handle, open(out_file, "w") as output_handle:
        sequences = SeqIO.parse(input_handle, "abi")
        count = SeqIO.write(sequences, output_handle, "fasta")
    print("Converted %i records" % count)

由于无论最后一个参数是什么,都将转换为“ fasta”格式,所以我想您可以将脚本重命名为convert_abi_to_fasta.py并删除最后一个参数。