在python中使用变量作为新文件名的一部分

时间:2016-09-15 20:13:11

标签: python fasta

我对python很新,我的python脚本(split_fasta.py)存在问题。以下是我的问题的一个例子:

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)

我已经离开了程序的底部部分,因为它不需要。我的问题是,当我运行这个程序与我的fasta123文件一样,它运行得很好:

  

python 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")

它在我当前的目录中创建一个输出文件。

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

1 个答案:

答案 0 :(得分:3)

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

如果您在os.path.basename上使用file,您将获得该文件的名称(例如,在我的示例中,something.fasta

来自@Adam Smith

  

您可以使用os.path.splitext删除.fasta

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

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

避免隐藏内置名称,例如liststrint ......它不明确,可能会在以后导致潜在问题。

打开文件进行读写时,应使用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)

通常情况下,人们会来找我,然后说" 那个丑陋的"。并不是的 :)。缩进的级别清楚地表明了什么是上下文。