从文本文件中提取两个定界符之间的文本

时间:2018-07-17 21:55:20

标签: python python-3.x text-analysis

我目前正在写有关CEO自恋的硕士论文。为了对其进行衡量,我必须进行收入电话文本分析。我按照this link中提供的答案用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]
..............................

我还有另一个txt文件(“ lista.txt”),在其中我从笔录中提取了所有定界符:

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

我想做的是从Delimiter CEO [2]与Delimiter [3]之间,...以及Delimiter CEO [n-1]与Delimiter [之间]的'testoestratto.txt'中提取文本。 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的初学者,所以如果代码混乱,我想道歉

1 个答案:

答案 0 :(得分:0)

您需要在代码中进行一些更改。

首先,这里的关键是在每次读取一次文件之后将其重置为文件的开头。由于尚未执行此操作,因此在嵌套for循环的第一次迭代之后,您的代码从不从头开始读取文件。 您可以使用infile.seek(0)来做到这一点。

第二,完成写入文件后,您需要将标志“ copy”的值重置为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)中运行。