使用for循环向表中添加新行:python

2024-10-03 19:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在搜索了两个正则表达式的DNA序列后,我试图创建一个.bed文件。理想情况下,我希望生成一个选项卡分隔的文件,其中包含序列描述、第一个正则表达式的开始位置和第二个正则表达式的结束位置。我知道regex部分是有效的,它只是创建了\t我正在处理的分离文件

我希望我可以打开/创建一个文件,只需为包含此信息的for loop的每次迭代打印一行新行,如下所示:

with open("Mimp_hits.bed", "a+") as file_object:
    for line in file_object:
        print(f'{sequence.description}\t{h.start()}\t{h_rc.end()}')
file_object.close()

但这似乎不起作用(创建空文件)。我还尝试使用file_object.write,但这同样会创建一个空文件

这是我所有的代码,包括搜索正则表达式:

import re, sys

from Bio import SeqIO
from Bio.SeqRecord import SeqRecord

infile = sys.argv[1]

for sequence in SeqIO.parse(infile, "fasta"):
    hit = re.finditer(r"CAGTGGG..GCAA[TA]AA", str(sequence.seq))
    mimp_length = 400
    for h in hit:
        h_start = h.start()
        hit_rc = re.finditer(r"TT[TA]TTGC..CCCACTG", str(sequence.seq))
        for h_rc in hit_rc:
            h_rc_end = h_rc.end()
            length = h_rc_end - h_start
            if length > 0:
                if length < mimp_length:
                    with open("Mimp_hits.bed", "a+") as file_object:
                        for line in file_object:
                            print(sequence.description, h.start(), h_rc.end())
                    file_object.close()

这是所需的输出:

Focub_II5_mimp_1__contig_1.16(656599:656809)    2   208
Focub_II5_mimp_2__contig_1.47(41315:41540)  2   223
Focub_II5_mimp_3__contig_1.65(13656:13882)  2   224
Focub_II5_mimp_4__contig_1.70(61591:61809)  2   216

这是示例输入:

>Focub_II5_mimp_1__contig_1.16(656599:656809)
TACAGTGGGATGCAAAAAGTATTCGCAGGTGTGTAGAGAGATTTGTTGCTCGGAAGCTAGTTAGGTGTAGCTTGTCAGGTTCTCAGTACCCTATATTACACCGAGATCAGCGGGATAATCTAGTCTCGAGTACATAAGCTAAGTTAAGCTACTAACTAGCGCAGCTGACACAACTTACACACCTGCAAATACTTTTTGCATCCCACTGTA
>Focub_II5_mimp_2__contig_1.47(41315:41540)
TACAGTGGGAGGCAATAAGTATGAATACCGGGCGTGTATTGTTTTCTGCCGCTAGCCCATTTTAACAGCTAGAGTGTGTATATTAACCTCACACATAGCTATCTCTTATACTAATTGGTTAGGGAAAACCTCTAACCAGGATTAGGAGTCAACATAGCTTGTTTTAGGCTAAGAGGTGTGTGTCAGTACACCAAAGGGTATTCATACTTATTGCCCCCCACTGTA
>Focub_II5_mimp_3__contig_1.65(13656:13882)
TACAGTGGGAGGCAATAAGTATGAATACCGGGCGTGTATTGTTTTTCTGCCGCTAGCCTATTTTAATAGTTAGAGTGTGCATATTAACCTCACACATAGCTATCTTATATACTAATCGGTTAGGGAAAACCTCTAACCAGGATTAGGAGTCAACATAGCTTCTTTTAGGCTAAGAGGTGTGTGTCAGTACACCAAAGGGTATTCATACTTATTGCCCCCCACTGTA
>Focub_II5_mimp_4__contig_1.70(61591:61809)
TACAGTGGGATGCAATAAGTTTGAATGCAGGCTGAAGTACCAGCTGTTGTAATCTAGCTCCTGTATACAACGCTTTAGCTTGATAAAGTAAGCGCTAAGCTGTATCAGGCAAAAGGCTATCCCGATTGGGGTATTGCTACGTAGGGAACTGGTCTTACCTTGGTTAGTCAGTGAATGTGTACTTGAGTTTGGATTCAAACTTATTGCATCCCACTGTA

有人能帮忙吗

谢谢:)


Tags: 文件inforobjectstartlengthfileend
2条回答

您正在尝试以“a+”模式打开文件,并在其中的行上循环(这样做时,文件位于末尾,因此将找不到任何内容)。在任何情况下,如果这只是一个输出文件,那么您将以“a”模式打开它以附加到它

可能您只想打开一次文件进行追加,在with语句中,当您想要实际向文件追加字符串时,使用file_object.write(...)执行主循环。请注意,使用此with构造时不需要file_object.close()

with open("Mimp_hits.bed", "a") as file_object:
    for sequence in SeqIO.parse(infile, "fasta"):
        # ... etc per original code ...
                    if length < mimp_length:
                        file_object.write("{}\t{}\t{}\n".format(
                                sequence.description, h.start(), h_rc.end()))

要将一行写入文件,您可以执行以下操作:

with open("file.txt", "a") as f:
    print("new line", file=f)

如果你想让它分开,你也可以添加sep="\t",这就是为什么python 3制作了^{} a function,所以你可以使用sependfileflush关键字参数

打开文件进行追加意味着文件指针从文件末尾开始,这意味着写入文件不会覆盖任何数据(被追加到文件末尾),而对其进行迭代(或从中读取)不会产生任何类似于已到达文件末尾的效果

因此,您不需要迭代文件的行,而只需将单行写入其中:

                with open("Mimp_hits.bed", "a") as file_object:
                    print(sequence.description, h.start(), h_rc.end(), file=file_object)

你也可以考虑打开一个文件在循环的开始附近,因为打开一次,写多次比打开多次效率更高,而且Fube会自动关闭文件,所以不需要显式地执行。p>

相关问题 更多 >