2016-11-11 118 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同意。将它设置为使用命令行参数,通过做这样的事情:

#!/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 input.fa A_ids.txt A.fasta,你的情况。或者,python inputB.fa B_ids.txt B.fasta

+0

这比argparse更轻量级,可能更适合OP。另外,你提供了一个有用的具体应用程序。 +1 – BlackVegetable

+0

谢谢@BlackVegetable我的道歉偷荣耀XD – SolarPixelGaming

+0

但在这种情况下,我需要运行指令40次...谢谢! – Paul

0

考虑让这个程序采取命令行选项。这将允许用户从命令行作为参数读取wanted_file名称,你可以通过解析给定的参数和以下的图案(如取代.fasta给定延伸),或具有的输出模式是另一命令推断适当的输出文件名有些种类的在线争论。

你可以通过庆典打电话给你的程序作为python my_script.py A_ids.txt和遍历这一点。您也可以选择允许可变数量的参数,每个参数都会调用您的逻辑来获取给定的名称。

根据您的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

我想更简单的方法可以在一个文件中存储的40名(代码:wanted_filenames_file),将它们存储在阵列(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

没有工作。我创建了一个文件,其中包含我想要的所有文件名(文件名.txt)。我得到了一些错误 - 来自:看不懂的/ var /邮件/生物 ./modified.py:4号线:fasta_file:找不到命令 ./modified.py:5号线:wanted_filenames_file:找不到命令 ./ modified.py:第6行:意外标记附近的语法错误'(' ./modified。py:第6行:'打开(wanted_filenames_file)为f:' – Paul

+0

@Clarissa是同时引发的三个错误?我想我没有明确解释。您必须创建一个名为'filenames.txt'的文件,您应该在其中存储所有文件名,每行一个。 –

+0

是的,我做到了。我创建了一个名为filenames.txt的文件,其中包含所有文件名,每行一个。 – Paul

相关问题