从文本文件中提取Python数据 - 脚本在预期数据匹配之前停止

时间:2018-02-22 00:24:30

标签: python-3.x

假设我在文本文件中包含此数据,该脚本将提取index1和index2之间的所有内容,并在输出文件中包含这些字符串。但由于某种原因,它会在index2之前停止几行。

  

哑数据

     

index1 0000

     

随机数据

     

index1 0000

     

随机数据

     

index1 0000

     

index2 0000

这是我的代码;它一看到index1就开始写入我的输出文件,但如果它看到index2,它应该写下最后一个匹配并退出。但它永远不会退出,它似乎挂起并在index2之前停止几行,但总是在同一条线上。如果数据不敏感,我会粘贴实际数据。

import re
myvar = False
myfile = open('extract','w')

with open('input.txt') as f:
    for line in f:
        if re.search(r'index1', line):
            myvar = True
            myfile.write(line)

        elif re.search(r'index2', line):
            myvar = False
            break

        elif myvar == True:
            myfile.write(line)
            continue

myfile.close
f.close

问题是,它适用于我的虚拟数据,但不适用于真实数据,它会在此行停止。它从表单提要开始,但我可能会搞砸它,但在此之前有多个表单提要打印到输出文件。

  

在日期时间第50页的FF(编辑)空白空白(编辑)日期时间

谢谢。

1 个答案:

答案 0 :(得分:1)

在我们讨论之后......

您可以通过从re.search切换到re.findall来简单地编写代码,消除循环并消除错误原因。这将产生一个列表 - 技术上是一个元组 - 包含所有匹配。

如果您想消除重复项,可以将列表转移到set,这是一个没有重复项的无序列表。

您还应该以与输入文件相同的方式将输出文件包装在上下文管理器(with open)中。这样可以更好地正确关闭文件。

如果你想对集合采取行动,你可以循环遍历它,就好像它是一个列表,或者如果你只需要一个元素(例如,用于测试代码的下一部分),你可以转换到列表 - list(j)[0]

import re

output = []
with open("extract.txt", 'w') as myfile:
    with open("input2.txt", 'r') as f:
        output = re.findall(r'index1.*?index3',f.read(), re.DOTALL)
    j = set(output)
    for x in j:
        myfile.write(x + '\n')

使用单个元素,它将更改为:

with open("extract.txt", 'w') as myfile:
    with open("input2.txt", 'r') as f:
        output = re.findall(r'index1.*?index3',f.read(), re.DOTALL)
    myfile.write(list(set(output))[0] + '\n')