我对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")
它在我当前的目录中创建一个输出文件。
我希望这对你们中的一些人有意义,并且我可以得到一些建议。
答案 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中不推荐的很多东西。我会详细介绍。
避免隐藏内置名称,例如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)
通常情况下,人们会来找我,然后说" 那个丑陋的"。并不是的 :)。缩进的级别清楚地表明了什么是上下文。