2016-09-15 671 views
1

我对python相当陌生,而且我的python脚本(split_fasta.py)有问题。这里是我的问题的一个例子:在python中使用变量作为新文件的名称的一部分

list = ["1.fasta", "2.fasta", "3.fasta"] 
for file in list: 
    contents = open(file, "r") 
    for line in contents: 
     if line[0] == ">": 
      new_file = open(file + "_chromosome.fasta", "w") 
      new_file.write(line) 

我已经离开了程序的底部部分,因为它不需要。我的问题是,当我在同一个direcoty我的fasta123文件运行这个程序,它的伟大工程:

蟒蛇split_fasta.py * .fasta

但是,如果我在不同的目录我希望程序输出新文件(例如1.fasta_chromsome.fasta)到我当前的目录中......它不会:

python /home/bin/split_fasta.py/home/data /*.fasta

这仍会在与fasta文件相同的目录中创建新文件。在这里,我敢肯定,问题是这一行:

new_file = open(file + "_chromosome.fasta", "w") 

因为如果我把它改成这样:

new_file = open("seq" + "_chromosome.fasta", "w") 

它创造了我的当前目录下的输出文件。

我希望这对你们中的一些人有意义,我可以得到一些建议。

+0

您应该结账BioPython –

回答

3

您正在给出旧文件的完整路径以及一个新名称。所以基本上,如果file == /home/data/something.fasta,输出文件将是file + "_chromosome.fasta"这是/home/data/something.fasta_chromosome.fasta

如果您在使用fileos.path.basename,你会得到的文件名(即在我的例子,something.fasta

从@Adam史密斯

您可以使用os.path.splitext摆脱的.fasta

basename, _ = os.path.splitext(os.path.basename(file)) 

回到代码示例,我看到了很多不推荐用Python的东西。我会详细介绍。

避免阴影内置名称,如list,str,int ......它不明确,可能会导致以后出现潜在问题。

打开文件进行读取或写入时,应使用with语法。这是强烈建议,因为它需要谨慎关闭文件。

with open(filename, "r") as f: 
    data = f.read() 
with open(new_filename, "w") as f: 
    f.write(data) 

如果你在你的文件中的空行,line[0] == ...将导致IndexError例外。改为使用line.startswith(...)

最终代码:

files = ["1.fasta", "2.fasta", "3.fasta"] 
for file in files: 
    with open(file, "r") as input: 
     for line in input: 
      if line.startswith(">"): 
       new_name = os.path.splitext(os.path.basename(file)) + "_chromosome.fasta" 
       with open(new_name, "w") as output: 
        output.write(line) 

通常,人们要是敢动我,并说 “这hugly”。不是真的 :)。缩进的级别清楚了什么是上下文。

+0

,您可以使用'os.path.splitext'来摆脱额外的'.fasta'! 'basename,_ = os.path.splitext(os.path.basename(file))' –

+0

已添加。谢谢,我不知道这一个。值得再读一遍'os.path' doc :) – FunkySayu

+0

这太好了!非常感谢您的帮助,绝对可以随时编辑@FunkySayu – Ryan

相关问题