我有一个很大的文本文件,包含很多部分。每个部分有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
但是它不返回我想要的。如何解决它以获得预期的输出?
答案 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)