Извлечь текст между двумя разделителями из текстового файла

В настоящее время я пишу магистерскую диссертацию о нарциссизме генерального директора. Чтобы измерить это, я должен сделать анализ текста звонков о доходах. Я написал код на python, следуя ответам, доступным в эта ссылка, которая позволяет мне извлечь раздел «Вопросы и ответы» из стенограммы телефонных разговоров. Вот такой файл (он называется testoestratto.txt):

..............................
Delimiter [1]
..............................
A text that I don't need
..............................
Delimiter CEO [2]
..............................
I need this text
..............................
Delimiter [3]
..............................

[...]

..............................
Delimiter CEO [n-1]
..............................
I also need this text
..............................
Delimiter [n]
..............................

У меня также есть еще один текстовый файл («lista.txt»), в котором я извлек все разделители из стенограммы:

Delimiter [1]
Delimiter CEO [2]
Delimiter [3]
[...]
Delimiter CEO [n-1]
Delimiter [n]

Что я хотел бы сделать, так это извлечь текст из 'testoestratto.txt' между генеральным директором-разделителем [2] и разделителем [3], ..., а также между генеральным директором-разделителем [n-1] и разделителем [n]. Извлеченный текст должен быть записан в 'test.txt'. Итак, если разделитель из «lista.txt» содержит слово CEO, мне нужен текст из «testoestratto.txt», который находится между этим конкретным разделителем и следующим разделителем из «lista.txt», в котором нет слова « Генеральный директор в нем. Для этого я написал следующий код:

with open('testoestratto.txt','r', encoding='UTF-8') as infile, open('test.txt','a', encoding='UTF-8') as outfile, open('lista.txt', 'r', encoding='UTF-8') as mylist:
   text= mylist.readlines()
   text= [frase.strip('\n') for frase in text]
   bucket=[] 
   copy = False
   for i in range(len(text)):
      for line in infile:                         
          if line.strip()==text[i] and text[i].count('CEO')!=0 and text[i].count('CEO')!= -1:                                                          
              copy=True                          
          elif line.strip()== text[i+1] and text[i+1].count('CEO')==0 or text[i+1].count('CEO')==-1:
              for strings in bucket:
                  outfile.write(strings + '\n')
          elif copy:
              bucket.append(line.strip())

Однако файл test.txt пуст. Не могли бы вы помочь мне?

P.S. : я новичок в python, поэтому я хотел бы извиниться, если код грязный


person Francesco    schedule 17.07.2018    source источник
comment
Можете ли вы настроить свой код для правильного отступа под вашим оператором with, пожалуйста?   -  person Sunny Patel    schedule 18.07.2018


Ответы (1)


Есть несколько вещей, которые вам нужно изменить в вашем коде.

Во-первых, ключевым моментом здесь является возврат строки к началу файла после каждой итерации его однократного чтения. Поскольку вы этого не сделали, ваш код никогда не читает файл с самого начала после первой итерации вложенного цикла for. Вы можете сделать это с помощью infile.seek(0).

Во-вторых, вам нужно сбросить значение вашего флага «копировать» на False, как только вы закончите запись в файл. Это гарантирует, что вы не запишете в файл текст, который вам не нужен. Кроме того, вам также необходимо очистить корзину, чтобы избежать многократного повторения одних и тех же строк в выводе.

В-третьих, вы включили в оператор elif множество ненужных проверок строк.

Я внес изменения в код ниже:

with open('testoestratto.txt','r', encoding='UTF-8') as infile, 
open('test.txt','a', encoding='UTF-8') as outfile, open('lista.txt', 'r', 
encoding='UTF-8') as mylist:
    text= mylist.readlines()
    text= [frase.strip('\n') for frase in text]
    bucket=[]
    copy = False
    for i in range(len(text)):
        for line in infile:
            if line.strip('\n')==text[i] and text[i].count('CEO') > 0:
                copy=True
            elif copy and line.strip('\n') == text[i+1]:
                for strings in bucket:
                    outfile.write(strings + '\n')
                copy = False
                bucket = list()
            elif copy:
                bucket.append(line.strip())
        infile.seek(0)

При этом вы также можете оптимизировать свой код. Как видите, этот код выполняется за O(n^3).

person Shreenath Iyer    schedule 17.07.2018
comment
Благодарю вас! Могу я спросить, почему в выходном файле нужные мне строки повторяются два раза? - person Francesco; 18.07.2018
comment
Скорее всего, это потому, что вы не опорожняете свое ведро. - person Shreenath Iyer; 19.07.2018