Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 大型文本文件中特定于python正则表达式的文本块_Performance - Fatal编程技术网

Performance 大型文本文件中特定于python正则表达式的文本块

Performance 大型文本文件中特定于python正则表达式的文本块,performance,Performance,我是python的新手,这个网站非常感谢您的。。。理解力这是我第一次尝试python脚本 我有一个我认为是一个性能问题,试图解决这个问题,这是导致我无法得到任何数据回来 这段代码在一个只有几页的小文本文件上工作,但是当我尝试在35MB的真实数据文本文件上使用它时,它只会命中CPU,并且现在没有返回任何大于24小时的数据 以下是35MB文本文件中的真实数据片段: D)dddld d00d90d dd ddd vsddfgsdfgsf dfsdfdsf aAAAAAa 221546 2980

我是python的新手,这个网站非常感谢您的。。。理解力这是我第一次尝试python脚本

我有一个我认为是一个性能问题,试图解决这个问题,这是导致我无法得到任何数据回来

这段代码在一个只有几页的小文本文件上工作,但是当我尝试在35MB的真实数据文本文件上使用它时,它只会命中CPU,并且现在没有返回任何大于24小时的数据

以下是35MB文本文件中的真实数据片段:

D)dddld
d00d90d
dd

ddd

vsddfgsdfgsf

dfsdfdsf
aAAAAAa

221546
29806916295
Meowing
fs:/mod/umbapp/umb/sentbox/221546.pdu
2013:10:4:22:11:31:4

sadfsdfsdf
sdfff
ff
f

29806916295
What's your cat doing?
fs:/mod/umbapp/umb/sentbox/10955.pdu
2013:10:4:22:10:15:4

aaa
aaa
aaaaa
我试图复制到新文件中的内容:

29806916295
Meowing
fs:/mod/umbapp/umb/sentbox/221546.pdu
2013:10:4:22:11:31:4

29806916295
What's your cat doing?
fs:/mod/umbapp/umb/sentbox/10955.pdu
2013:10:4:22:10:15:4
我的Python代码是:

import re

with open('testdata.txt') as myfile:
    content = myfile.read()

text = re.search(r'\d{11}.*\n.*\n.*(\d{4})\D+(\d{2})\D+(\d{1})\D+(\d{2})\D+(\d{2})\D+\d{2}\D+\d{1}', content, re.DOTALL).group()
with open("result.txt", "w") as myfile2:
    myfile2.write(text)

正则表达式不是搜索字符串的最快方法。您还有一个非常大的字符串35MB,这使问题更加复杂。通常不建议将整个文件读入内存,因为您可能会遇到内存问题

从您的正则表达式模式判断,似乎您想要捕获以11位字符串开始,以某个时间线字符串结束的4行组。请尝试以下代码:

import re

start_pattern = re.compile(r'^\d{11}$')
end_pattern   = re.compile(r'^\d{4}\D+\d{2}\D+\d{1}\D+\d{2}\D+\d{2}\D+\d{2}\D+\d{1}$')

capturing = 0
capture   = ''

with open('output.txt', 'w') as output_file:
    with open('input.txt', 'r') as input_file:
        for line in input_file:
            if capturing > 0 and capturing <= 4:
                capturing += 1
                capture   += line                
            elif start_pattern.match(line):
                capturing = 1
                capture   = line

            if capturing == 4:
                if end_pattern.match(line):
                    output_file.write(capture + '\n')
                else:
                    capturing = 0

它逐行迭代输入文件。如果它发现一行与start_模式匹配,它将再读取3。如果第4行与end_模式匹配,它会将整个组写入输出文件。

这很有魅力,非常感谢您的回答!