Как выделить строковые вхождения в отдельный текстовый файл? - PullRequest
0 голосов
/ 15 мая 2018

Например, у меня есть txt-файлы, содержащие эти строки,

chicken
chicken
duck
duck
duck
parrot
parrot
chicken
chicken
chicken

Как я могу прочитать его построчно и разделить курицу (2 строки) на 1.txt, утку (3 строки) на2.txt и попугай (2 строки) до 3.txt и последняя курица (3 строки) вхождения в 4.txt?

Я до сих пор разобрался,

count = 0

with open("test.txt") as rl:
    for num, line in enumerate (rl, 1):
        s = list(line)
        if "chicken" in line:
            count += 1

            finaljoin = "".join(s)

            print(count)

            with open("chicken.txt", 'a+') as f:
                f.write(finaljoin)

Но мое решение, приведенное выше, содержит только одну курицу (всего 5).Фактический план состоял в том, чтобы получить первые две строки в текстовый файл, а последние две строки в другой текстовый файл.Потому что его разделяют другие животные.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

На самом деле, вы еще не поняли. У вас нет условий для разделения; все, что вы сделали, - это нашли "курицу", где бы она ни появлялась, и поместили эти восстановленные строки в файл "chicken.txt". Вы не предусмотрели ни одного другого животного, и нет логических попыток найти эти разрывы. Кроме того, в этом много лишнего кода, например, многократное открытие выходного файла и генерация num, который никогда не используется.

Нарисуйте свою основную логику на бумаге, если это необходимо. Важный шаг, который вы пропустили, - это сравнить предыдущее животное с текущим. Это что-то типа

previous = None
with open("test.txt") as zoo:
    for animal in zoo:
        if animal == previous:
            # Process same animal
        else:
            # Process new animal
        previous = animal   # remember animal for next iteration

Можете ли вы взять его оттуда? для num, строка в перечислении (rl, 1):

0 голосов
/ 15 мая 2018

Вы можете сделать это следующим образом:

from itertools import groupby

with open('test.txt') as f:
    data = f.read().split('\n')

for ind, (_, g) in enumerate(groupby(data),1):
    with open('{}.txt'.format(ind), 'w') as f:
        f.write('\n'.join(g))

Объяснение:

Вы можете прочитать о группе Itertools здесь: https://docs.python.org/2/library/itertools.html#itertools.groupby.

Groupby вернет два элемента, ключ и группу.Поэтому, если мы хотим перебрать группу, мы бы сделали что-то вроде этого: for key, group in groupby(object): или for k, g in groupby(object):

Теперь в этом случае ключи будут chicken, duck, parrot, chicken, а группы будут ['chicken', 'chicken'] , ['duck','duck... ...]

Однако (теперь идет часть, где я объясняю ind, (_, g)), чтобы получить индекс во время цикла, мы можем использовать функцию перечисления Python, которая будет возвращать индекс и итератор.Обычно это выглядит так: for index, item in enumerate(list): или for ind, i in enumerate(list).

Теперь, допустим, мы хотим объединить enumerate и groupby.Тогда мы могли бы сделать это так: for index, (key, group) in enumerate(groupby(object)): или более компактно: for ind, (_, g) ....Я использую _ в этом случае (и это Pythonic), чтобы сигнализировать, что я не заинтересован в переменной (ключ в этом случае).

0 голосов
/ 15 мая 2018

Вы можете попробовать:

count = 0
with open("test.txt") as readFile:
    previous_line = ""
    archive_name = ""
    for line in readFile:
        if line != previous_line:
             previous_line = line
             count += 1
             archive_name = str(count)+".txt"
        with open(archive_name, 'a+') as f:  
            f.write(line)

Это сохранит «куриную курицу» в 1.txt, «утиную утиную утку» в 2.txt, «попугая попугая» в 3.txt и «куриную курицу»курица "в 4.txt

...