当它是 python 中的变量时,如何更改文件名的一部分?

How do I change part of a file name when it is a variable in python?

我目前有一个 python 脚本,它将一个文件作为命令行参数,执行它需要做的事情,然后输出附加了 _all_ORF.fsa_aa 的文件。我想实际编辑文件名而不是附加文件名,但我对变量感到困惑。当文件是变量时,我不确定如何实际执行此操作。

这是命令行参数的示例:

gL=genomeList.txt   #Text file containing a list of genomes to loop through.             

for i in $(cat ${gL}); do
    #some other stuff ; 
    python ./find_all_ORF_from_getorf.py ${i}_getorf.fsa_aa ; 
    done

这是一些 python 脚本 (find_all_ORF_from_getorf.py):

import re, sys

from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord

infile = sys.argv[1]

with open(f'{infile}_all_ORF.fsa_aa'.format(), "a") as file_object:
    for sequence in SeqIO.parse(infile, "fasta"):
       #do some stuff
       print(f'{sequence.description}_ORF_from_position_{h.start()},\n{sequence.seq[h_start:]}', 
       file=file_object)

当前,oupt 文件名为 Genome_file_getorf.fsa_aa_all_ORF.fsa_aa。我想删除第一个 fsa_aa,以便输出如下所示:Genome_file_getorf_all_ORF.fsa_aa。我该怎么做呢?我不知道如何编辑它。

我看过 os.rename module,但似乎无法编辑变量名,只能附加到它。

谢谢,

J

关于您的 bash 代码,您可能会发现以下代码片段很有用,我发现它更具可读性,并且在遍历行时我倾向于经常使用它。

while read line; do
    #some other stuff ; 
    python ./find_all_ORF_from_getorf.py ${line}_getorf.fsa_aa ; 
done < genomeList.txt

现在关于你的问题和你的 python 代码

import re, sys 

from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord

infile = sys.argv[1]

此时你的 infile 看起来像 'Genome_file_getorf.fsa_aa' 一种选择是通过“.”拆分此字符串。并获得第一项

name = infile.split('.')[0]

如果您知道可能有多个“.”在文件名中,例如 'Myfile.out.old' 而您只想去掉最后一个扩展名

name = infile.rsplit('.',1)[0]

第三种选择,如果您知道所有文件都以“.fsa_aa”结尾,您可以使用负索引对字符串进行切片。因为 '.fsa_aa' 有 7 个字符:

name = input[:-7] 

这三个选项基于python中字符串处理的字符串方法,更多见official python docs

outfile = f'{name}_all_ORF.fsa_aa' 
# if you wrote f'{variable}' you don't need the ".format()"
# On the other hand you can do '{}'.format(variable)
# or even '{variable}'.format(variable=SomeOtherVariable)

with open(outfile, "a") as file_object:
    for sequence in SeqIO.parse(infile, "fasta"):
       #do some stuff
       file_object.write(f'{sequence.description}_ORF_from_position_{h.start()},\n{sequence.seq[h_start:]}')

另一种选择是使用 pathlib library 中的 Path 我建议您尝试一下这个库。在这种情况下,您将不得不对代码做一些其他的小改动:

import re, sys
from pathlib import Path # <- Here

from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord

infile = Path(sys.argv[1]) # <- Here
outfile = infile.stem + '_all_ORF.fsa_aa' # <- Here 
# And if you want to use outfile as a path I would suggest instead
# outfile = infile.parent.joinpath(infile.stem)

with open(outfile, "a") as file_object:
    for sequence in SeqIO.parse(infile, "fasta"):
       #do some stuff
       file_object.write(f'{sequence.description}_ORF_from_position_{h.start()},\n{sequence.seq[h_start:]}')

最后,正如您在这两种情况下看到的那样,我已将打印语句替换为 file_object.write 方法,写入文件而不是打印到文件是更好的做法。