Как сохранить следующие две строки, используя перечисление и следующий - PullRequest
0 голосов
/ 18 июня 2019

У меня есть файл, где шаблон повторяется каждые 4 строки.Я хотел бы взглянуть на файл, и если вторая строка (в 4-строчном блоке) длиннее 2000 символов, я бы хотела записать 4-строчный блок в выходной файл.

Я должен начать с того, что я биолог, а не CS, поэтому я относительно новичок в кодировании.Я пытаюсь выполнить свою задачу, используя перечисление, чтобы подсчитать, на какой строке я нахожусь, также перечисление является итеративным, поэтому я считаю, что могу вызвать следующую функцию.Однако когда я запускаю приведенный ниже блок кода, я в итоге печатаю все четыре строки в группе, когда теоретически мне нужно печатать только третью и четвертую строки.Однако, когда я запускаю этот код, я в итоге печатаю все строки.что является запутанной частью.

with open('file', 'r') as f:
    for i, line in enumerate(f, 1):
     if i % 4 == 1:
         first_line = line 
     if i % 4 == 2:
        if len(line.strip()) > 2000:
            seq_line = line
            third_line = next(f)
            fourth_line = next(f)
            print(third_line)
            print(fourth_line)
        else:
            pass

Даже если я попробую что-нибудь простое, например:

with open('file', 'r') as f:
    for i, line in enumerate(f, 1):
     if i % 4 == 1:
         first_line = line 
     if i % 4 == 2:
         print(line)
         print(next(f))

, я получаю все строки, которые до сих пор не понимаю.

Спасибо.

Ответы [ 4 ]

1 голос
/ 18 июня 2019

Я бы даже не стал использовать enumerate или next.

with open('file', 'r') as f:

    # keep going until we exhaust the file
    while True:
        # read the next four lines of the file
        line1 = f.readline()
        line2 = f.readline()
        line3 = f.readline()
        line4 = f.readline()

        # if any of the lines are completely blank, the file is exhausted
        if not line1 or not line2 or not line3 or not line4:
            break

        # if line2 is long enough, print the block
        if len(line2) > 2000:
            print (line1)
            print (line2)
            print (line3)
            print (line4)
1 голос
/ 19 июня 2019

Использование модуля re для поиска фрагментов из 4 строк ( regex101 ):

import re

with open('file.txt', 'r') as f_in, \
     open('file_out.txt', 'w') as f_out:

    for g in re.finditer(r'([^\n]+(?:\n|\Z)){4}', f_in.read(), flags=re.DOTALL):
        if len(g[0].splitlines()[1]) > 2000:
            f_out.write(g[0])
0 голосов
/ 19 июня 2019

Если файлы не до смешного огромны и память не представляет проблемы, вы можете альтернативно просто прочитать весь документ, а затем использовать for для проверки только каждой 4-й строки, начинающейся свторая строка (помните, что индексирование начинается с 0, поэтому мы проверяем строки № 1, затем № 5, № 9 и т. д.), не беспокоясь о enumerate, вложенных if, next или модульной арифметике.

Чтобы убедиться, что у вас есть полный блок из 4 строк для просмотра каждый раз, вы можете перебирать последнюю строку каждого полного блока из 4 (строки № 3, № 7, № 11 и т. Д.), затем проверьте только строку, которая идет 2 перед этим.Когда вы найдете совпадение, напишите все 4 строки.

with open(filename, 'r') as f:
    lines = f.readlines()

with open(outputfile, "w") as g:
    for line_num in range(3, len(lines), 4):
        if len(lines[line_num - 2]) > 2000:
            g.write(lines[line_num - 3])
            g.write(lines[line_num - 2])
            g.write(lines[line_num - 1])
            g.write(lines[line_num])

Синтаксис range() - range(from, to, skip).Более конкретно, команда range(3, len(lines), 4) возвращает список всех целых чисел, начинающихся с 3, затем вплоть до числа, равного общему количеству строк в документе, но занимающего только каждое четвертое целое число.Так что это список [3, 7, 11, 15, 19, ... ] и так далее, пока у вас не закончатся номера строк.

0 голосов
/ 18 июня 2019

enumerate() также возвращает итератор.Вы можете присвоить это переменной, а затем увеличить ее на next() вместо увеличения итератора файла.Таким образом, индекс i будет правильно увеличен.

with open('file', 'r') as f:
    lines = enumerate(f, 1)
    for i, line in lines:
        if i % 4 == 1:
            first_line = line 
        elif i % 4 == 2:
            if len(line.strip()) > 2000:
                seq_line = line
                _, third_line = next(lines)
                _, fourth_line = next(lines)
                print(third_line)
                print(fourth_line)
            else:
                pass
...