猿问

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

在搜索两个正则表达式的 DNA 序列后,我试图创建一个 .bed 文件。理想情况下,我想生成一个制表符分隔的文件,其中包含序列描述、第一个正则表达式的起始位置和第二个正则表达式的结束位置。我知道正则表达式部分有效,它只是创建了我正在努力处理的 \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

有人能帮忙吗?


喵喵时光机
浏览 154回答 2
2回答

MMMHUHU

要向文件中写入一行,您需要执行以下操作:with open("file.txt", "a") as f:     print("new line", file=f)如果你想用制表符分隔你也可以添加sep="\t",这就是为什么 python 3 做了print一个函数所以你可以使用sep, end, file, 和flush关键字参数。:)打开文件进行附加意味着文件指针从文件末尾开始,这意味着写入它不会覆盖任何数据(附加到文件末尾)并迭代它(或以其他方式读取它)给出没有什么比你已经到达文件末尾更重要的了。因此,您无需遍历文件的行,而只需向其中写入一行:                with open("Mimp_hits.bed", "a") as file_object:                                     print(sequence.description, h.start(), h_rc.end(), file=file_object)您还可以考虑只在循环开始附近打开文件,因为打开它一次并写入多次比多次打开它更有效,而且 with 块会自动关闭文件,因此无需显式执行此操作。

桃花长相依

您正在尝试以“a+”模式打开文件,并从中循环遍历行(这将找不到任何内容,因为当您这样做时文件位于末尾)。在任何情况下,如果这只是一个输出文件,那么您将以“a”模式打开它以附加到它。可能您只想打开文件一次以进行追加,并在with语句内部执行主循环,file_object.write(...)在您真正想将字符串追加到文件时使用。file_object.close()请注意,使用此构造时不需要 for with。with open("Mimp_hits.bed", "a") as file_object:&nbsp; &nbsp; for sequence in SeqIO.parse(infile, "fasta"):&nbsp; &nbsp; &nbsp; &nbsp; # ... etc per original code ...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if length < mimp_length:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file_object.write("{}\t{}\t{}\n".format(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sequence.description, h.start(), h_rc.end()))
随时随地看视频慕课网APP

相关分类

Python
我要回答