У меня большой текстовый файл с большим количеством деталей. Каждая часть имеет 4 строки, и следующая часть начинается сразу после последней части. first line
каждой части начинается с @
, 2nd line
- это sequence
символов, 3rd line
- +
а 4th line
- sequence of characters
.
Небольшой пример:
@M00872:462:000000000-D47VR:1:1101:15294:1338 1:N:0:ACATCG
TGCTCGGTGTATGTAAACTTCCGACTTCAACTGTATAGGGATCCAATTTTGACAAAATATTAACGCTTATCGATAAAATTTTGAATTTTGTAACTTGTTTTTGTAATTCTTTAGTTTGTATGTCTGTTGCTATTATGTCTACTATTCTTTCCCCTGCACTGTACCCCCCAATCCCCCCTTTTCTTTTAAAAGTTAACCGATACCGTCGAGATCCGTTCACTAATCGAACGGATCTGTCTCTGTCTCTCTC
+
BAABBADBBBFFGGGGGGGGGGGGGGGHHGHHGH55FB3A3GGH3ADG5FAAFEGHHFFEFHD5AEG1EF511F1?GFH3@BFADGD55F?@GFHFGGFCGG/GHGHHHHHHHDBG4E?FB?BGHHHHHHHHHHHHHHHHHFHHHHHHHHHGHGHGHHHHHFHHHHHGGGGHHHHGGGGHHHHHHHGHGHHHHHHFGHCFGGGHGGGGGGGGFGGEGBFGGGGGGGGGFGGGGFFB9/BFFFFFFFFFF/
Я хочу изменить вторую и четвертую строки каждой части и создать новый файл с аналогичной структурой (по 4 строки для каждой части). На самом деле я хочу сохранить первые 65 символов (в строках 2 и 4) и удалить остальные символы. Ожидаемый результат для небольшого примера будет выглядеть так:
@M00872:462:000000000-D47VR:1:1101:15294:1338 1:N:0:ACATCG
TGCTCGGTGTATGTAAACTTCCGACTTCAACTGTATAGGGATCCAATTTTGACAAAATATTAACG
+
BAABBADBBBFFGGGGGGGGGGGGGGGHHGHHGH55FB3A3GGH3ADG5FAAFEGHHFFEFHD5A
Я написал следующий код:
infile = open("file.fastq", "r")
new_line=[]
for line_number in len(infile.readlines()):
if line_number ==2 or line_number ==4:
new_line.append(infile[line_number])
with open('out_file.fastq', 'w') as f:
for item in new_line:
f.write("%s\n" % item)
но он не возвращает то, что я хочу. Как исправить это, чтобы получить ожидаемый результат?
Я думаю, что некоторые 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))
Этот код достигнет того, чего вы хотите -
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
и выполняем строчную сортировку. В конце концов мы присоединяемся к этой строке и записываем ее в новый файл.
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)