Python Запись строк текста между диапазонами чисел в новый файл - PullRequest
1 голос
/ 10 марта 2020

Образец текстового файла:

1. some text here
2. more text here
more text here
more text here
more text here
3. more text here
more text here
more text here
more text here
4. more text here
more text here
more text here
more text here
5. more text here
more text here
more text here
more text here
6. last text here
more text here
more text here
more text here

1. new text here
more text here
more text here
2. some more text
more text here
3. a bit more text
more text here
4. ok this is enough text.

1. nawww heres a bit more text.
more text here
more text here
2. okay this is the final text.
more text here
more text here
3. just to be sure this is last.
more text here
1. etc

Это пример текста из того, что у меня есть, но он намного короче.

У меня есть python код для начала:

with open("text.txt") as txt_file:
    lines = txt_file.readlines()
    for line in lines:
        if line.startswith('1.'):
            print(line)

Но я застрял с тем фактом, что понятия не имею, как напечатать все строки после 1., до следующей 1. в отдельный файл

I Я предполагаю, что мне понадобится какой-то for l oop в последнем утверждении if, которое у меня есть, но я не уверен, как go сделать это.

Например, я ожидаю, что мои результаты будут такими:

Если строка начинается с 1.. Запишите текст и затем в новый текстовый файл до следующей строки, которая начинается с 1., затем начните весь процесс заново, пока не останется больше текста. Так что для примера текста выше у меня должны быть 4 файлы.

В этом случае номер файла 1. будет содержать весь текст из абзацев 1-6.

1. some text here
2. more text here
more text here
more text here
more text here
3. more text here
more text here
more text here
more text here
4. more text here
more text here
more text here
more text here
5. more text here
more text here
more text here
more text here
6. last text here
more text here
more text here
more text here

Номер файла 2. будет содержать весь текст из second 1. в текстовом файле образца из всех абзацев 1-4

1. new text here
more text here
more text here
2. some more text
more text here
3. a bit more text
more text here
4. ok this is enough text.

Номер файла 3. будет есть весь текст из third 1. в текстовом файле примера из всех абзацев из 1-3

1. nawww heres a bit more text.
more text here
more text here
2. okay this is the final text.
more text here
more text here
3. just to be sure this is last.
more text here

И так, один ...

Надеюсь, я объясняю это право и таким образом, что имеет смысл.

Ответы [ 4 ]

4 голосов
/ 10 марта 2020

Одним из простых подходов было бы разделить файл в каждой строке, которая начинается с 1.:

import re
with open("text.txt") as txt_file:
    content = txt_file.read()
    chunks = []
    for match in re.split(r"(?=^1\.)", content, flags=re.MULTILINE):
        if match:
            chunks.append(match)

Теперь у вас есть список текстов, каждый из которых начинается с 1., который вы можете повторять и сохранить в отдельные файлы.

1 голос
/ 10 марта 2020

Вот еще одно решение. Вы можете настроить это, как считаете нужным, но я нашел индекс всех строк, содержащих 1., а затем просто записал строки между этими индексами в новые файлы.

with open('test.txt') as f:
    lines = f.readlines()
    ones_index = []
    for idx, line in enumerate(lines):
        if '1.' in line:
            ones_index.append(idx)

    ones_index[len(lines):] = [len(lines)]

    for i in range(len(ones_index)-1):
        start = ones_index[i]
        stop = ones_index[i+1]
        with open('newfile-{}.txt'.format(i), 'w') as g:
            g.write('\n'.join(lines[start:stop]))

Редактировать: я только что понял сначала не обрабатывал самый последний диапазон строк. Добавлена ​​новая строка, чтобы исправить это.

0 голосов
/ 10 марта 2020

Если вы хотите избежать чтения всего файла в память, вы можете создать генератор, который собирает группы по мере их поступления из файла и выдает их, когда у вас есть полная группа. Что-то вроде:

def splitgroups(text):
    lines = None
    for line in text:
        if line.startswith("1."):
            if lines is not None:
                yield lines
            lines = line
        else:
            lines += line
    yield lines

with open(filepath) as text:
    # iterate over groups rather than lines
    # and do what you want with each chunk:
    for group in splitgroups(text):
        print("*********")
        print(group)
0 голосов
/ 10 марта 2020

вы создаете переменную n = 0

n = 0
for i in range(k):  

   while(n == i):
       print(line)
       if line.startswith(str(k)+"."):
           n += 1

, если хотите, вы можете создать ди c, в котором вы можете сохранить свои строки как 1.line = [] в виде списков. Затем вы можете создать CSV-файл с библиотекой pandas. Надеюсь, это поможет, если я правильно понимаю.

...