为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喵时光机 2023-05-16 15:49:40
在搜索两个正则表达式的 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, sysfrom Bio import SeqIOfrom Bio.SeqRecord import SeqRecordinfile = 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   208Focub_II5_mimp_2__contig_1.47(41315:41540)  2   223Focub_II5_mimp_3__contig_1.65(13656:13882)  2   224Focub_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有人能帮忙吗?
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

要向文件中写入一行,您需要执行以下操作:

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

如果你想用制表符分隔你也可以添加sep="\t",这就是为什么 python 3 做了print一个函数所以你可以使用sependfile, 和flush关键字参数。:)

打开文件进行附加意味着文件指针从文件末尾开始,这意味着写入它不会覆盖任何数据(附加到文件末尾)并迭代它(或以其他方式读取它)给出没有什么比你已经到达文件末尾更重要的了。

因此,您无需遍历文件的行,而只需向其中写入一行:

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

您还可以考虑只在循环开始附近打开文件,因为打开它一次并写入多次比多次打开它更有效,而且 with 块会自动关闭文件,因此无需显式执行此操作。


查看完整回答
反对 回复 2023-05-16
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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


可能您只想打开文件一次以进行追加,并在with语句内部执行主循环,file_object.write(...)在您真正想将字符串追加到文件时使用。file_object.close()请注意,使用此构造时不需要 for with。


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()))


查看完整回答
反对 回复 2023-05-16
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信