更改文本文件的内容并制作具有相同格式的新文件

时间:2018-10-11 12:23:40

标签: python

我有一个很大的文本文件,包含很多部分。每个部分有4行,下一部分在最后一部分之后立即开始。 每个部分的first line@开头,2nd line是一个sequence个字符,3rd line是一个+,而{{ 1}}再次是4th line

小例子:

sequence of characters

我想更改每个部分的第二行和第四行,并制作一个具有相似结构的新文件(每个部分4行)。实际上,我想保留第1个65个字符(在第2行和第4行中)并删除其余字符。该小示例的预期输出将如下所示:

@M00872:462:000000000-D47VR:1:1101:15294:1338 1:N:0:ACATCG
TGCTCGGTGTATGTAAACTTCCGACTTCAACTGTATAGGGATCCAATTTTGACAAAATATTAACGCTTATCGATAAAATTTTGAATTTTGTAACTTGTTTTTGTAATTCTTTAGTTTGTATGTCTGTTGCTATTATGTCTACTATTCTTTCCCCTGCACTGTACCCCCCAATCCCCCCTTTTCTTTTAAAAGTTAACCGATACCGTCGAGATCCGTTCACTAATCGAACGGATCTGTCTCTGTCTCTCTC
+
BAABBADBBBFFGGGGGGGGGGGGGGGHHGHHGH55FB3A3GGH3ADG5FAAFEGHHFFEFHD5AEG1EF511F1?GFH3@BFADGD55F?@GFHFGGFCGG/GHGHHHHHHHDBG4E?FB?BGHHHHHHHHHHHHHHHHHFHHHHHHHHHGHGHGHHHHHFHHHHHGGGGHHHHGGGGHHHHHHHGHGHHHHHHFGHCFGGGHGGGGGGGGFGGEGBFGGGGGGGGGFGGGGFFB9/BFFFFFFFFFF/

我编写了以下代码:

@M00872:462:000000000-D47VR:1:1101:15294:1338 1:N:0:ACATCG
TGCTCGGTGTATGTAAACTTCCGACTTCAACTGTATAGGGATCCAATTTTGACAAAATATTAACG
+
BAABBADBBBFFGGGGGGGGGGGGGGGHHGHHGH55FB3A3GGH3ADG5FAAFEGHHFFEFHD5A

但是它不返回我想要的。如何解决它以获得预期的输出?

3 个答案:

答案 0 :(得分:2)

此代码将实现您想要的-

from itertools import islice
with open('bio.txt', 'r') as infile:
    while True:
        lines_gen = list(islice(infile, 4))
        if not lines_gen:
            break
        a,b,c,d = lines_gen
        b = b[0:65]+'\n'
        d = d[0:65]+'\n'
        with open('mod_bio.txt', 'a+') as f:
            f.write(a+b+c+d)

它如何工作?
正如您提到的,我们首先制作一个生成器,一次生成4行。 然后,将这些行打开为单独的行a,b,c,d并执行字符串切片。最终,我们加入了该字符串并将其写入新文件。

答案 1 :(得分:2)

我认为这里的一些itertools.cycle可能不错:

import itertools

with open("transformed.file.fastq", "w+") as output_file:
    with open("file.fastq", "r") as input_file:
        for i in itertools.cycle((1,2,3,4)):
            line = input_file.readline().strip()
            if not line:
                break
            if i in (2,4):
                line = line[:65]
            output_file.write("{}\n".format(line))

答案 2 :(得分:1)

readlines()将返回文件中每一行的列表。您无需准备列表new_line。直接遍历列表的索引值对,然后可以在所需位置修改所有值。

通过修改您的代码,请尝试

infile = open("file.fastq", "r")
new_lines = infile.readlines()
for i, t in enumerate(new_lines):
    if i == 1 or i == 3:
        new_lines[i] = new_lines[i][:65]

with open('out_file.fastq', 'w') as f:
    for item in new_lines:
        f.write("%s" % item)