我是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)
答案 0 :(得分:0)
正则表达式不是搜索字符串的最快方式。您还通过使用非常大的字符串(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_pattern
匹配的行,则会再读取3行。如果第4行与end_pattern
匹配,它会将整个组写入输出文件。