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