Как читать строку, чтобы найти строку соответствия и разбить результат на несколько файлов - PullRequest
0 голосов
/ 26 апреля 2018

Это сценарий, у меня есть файл шаблона, который мне нужно было читать построчно.

Содержимое файла шаблона несколько похоже на это

chicken 
chicken
chicken
chicken
## comment
## comment
fish
fish
chicken
chicken
chicken

Код, который я дошел до сих пор, выглядит следующим образом.

def readlines_write():
    with open(filename) as rl:
        for line in rl:
            if "chicken" in line:
                with open(new_filename, 'a+') as new_rl:
                    new_rl.write(line)

С помощью приведенного выше кода я могу найти все "курицы" в этом файле шаблона, и результат будет записан в new_filename. Но это не цель. Потому что у меня есть все вместе в одном файле.

Я хотел бы разделить курицу и записать ее в несколько файлов.

Например. В конечном итоге результат должен быть: читать строку за строкой непрерывно, если найдена курица, и остановиться, когда следующая строка не содержит курицу. Разбейте его и запишите в файл, например, в формате a.out.

И сценарий продолжает читать построчно и находит следующие совпадения после «комментария» и «рыбы». И запишите результат в b.out

Я имею в виду псевдо, но я не уверен, как перевести его в логику Python.

Резюме, я хотел бы разделить курицу, отделившуюся комментарием и другими словами, кроме курицы.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Итак, вы ищете смежные группы из chicken строк, и вы хотите поместить каждую группу в отдельный файл. Хорошо, батареи включены .

import itertools

def is_chicken(x):
    return 'chicken' in x # Can add more complex logic.

def write_groups(input_sequence):
    count = 1
    grouper = itertools.groupby(input_sequence, is_chicken)
    for found, group in grouper:
        # The value of `found` here is what `is_chicken` returned;
        # we only want groups where it returned true.
        if found:
            with open('file-%d.chicken' % count, 'w') as f:
                f.writelines(group)
            count += 1

Теперь вы можете

with open('input_file') as input_file:
    write_groups(input_file)

То же самое можно сделать более функционально разложенным способом, хотя и сложнее понять, что вы не привыкли к генераторам:

def get_groups(input_sequence):
    grouper = itertools.groupby(input_sequence, is_chicken)
    # Return a generator producing only the groups we want.
    return (group for (found, group) in grouper if found)


with open('input_file') as input_file:
    for (count, group) in enumerate(get_groups(input_file), start=1):
        with open('file-%d.chicken' % count, 'w') as f:
            f.writelines(group)
0 голосов
/ 26 апреля 2018

Просто добавьте условие else и продолжайте изменять имя файла целым числом или отметкой времени.

def readlines_write():
        i = 0
        new_filename = 'filename{}.out'.format(i)
        with open(filename) as rl:
            for line in rl:
                if "chicken" in line:
                    with open(new_filename, 'a+') as new_rl:
                        new_rl.write(line)
                else:
                    i +=1
                    new_filename = 'filename{}.out'.format(i)
...