如何读取 Python 中与在日志文件中找到的搜索相关的前几行?
How to read previous lines in Python relative to a search found in the log file?
我是 Python 的新手,所以只是尝试使用它。
我有一个巨大的文件,在搜索一个搜索短语后,我应该返回 n 行并获取文本的开头,开始标记。
之后从那个位置开始阅读。
短语可以出现多次。并且有多个开始标签。
请找到如下示例文件:
<module>
hi
flowers
<name>xxx</name>
<age>46</age>
</module>
<module>
<place>yyyy</place>
<name>janiiiii</janii>
</module>
假设搜索是 ,我需要在搜索 . & 之间的线条会有所不同,它们不是静态的。因此,一旦找到名称,我需要返回到模块行并开始阅读它。
请找到以下代码:
from itertools import islice
lastiterline=none
line_num=0
search_phrase="Janiii"
with open ('c:\sample.txt',"rb+") as f:
for line in f:
line_num+=1
line=line.strip()
if line.startswith("<module>"):
lastiterline=line
linec=line_num
elif line find(search_phrase)>=0:
if lastiterline:
print line
print linec
这有助于我获取与单词对应的模块的行号 searched.But 我无法将指针移回以重新开始从模块中读取行。会有多个搜索短语,所以每次我需要返回到那一行而不破坏 main for,它会读取整个大文件。
例如:可能有 100 个模块标签,里面可能有 10 个我想要的搜索短语,所以我只需要这 10 个模块标签。
好的,这是给你的例子,所以你可以更具体地说明你的需要。
这是您的示例 huge_file.txt
:
wgoi jowijg
<start tag>
wfejoije jfie
fwjoejo
THE PHRASE
jwieo
<end tag>
wjefoiw wgworjg
<start tag>
wjgoirg
<end tag>
<start tag>
wfejoije jfie
fwjoejo
woeoj
jwieo
THE PHRASE
<end tag>
还有一个脚本read_prev_lines.py
:
hugefile = open("huge_file.txt", "r")
hugefile = hugefile.readlines()
start_locations = []
current_block = -1
for idx, line in enumerate(hugefile):
if "<start tag>" in line:
start_locations.append({"start": idx})
current_block += 1
if "THE PHRASE" in line:
start_locations[current_block]["phr"] = idx
if "<end tag>" in line:
start_locations[current_block]["end"] = idx
#for i in phrase_locations:
for idx in range(len(start_locations)):
if "phr" in start_locations[idx].keys():
print("Found THE PHRASE after %d start tag(s), at line %d:" % (idx, start_locations[idx]["phr"]))
print("Here is the whole block that contains the phrase:")
print(hugefile[start_locations[idx]["start"]: start_locations[idx]["end"]+1])
我是 Python 的新手,所以只是尝试使用它。
我有一个巨大的文件,在搜索一个搜索短语后,我应该返回 n 行并获取文本的开头,开始标记。
之后从那个位置开始阅读。
短语可以出现多次。并且有多个开始标签。 请找到如下示例文件:
<module>
hi
flowers
<name>xxx</name>
<age>46</age>
</module>
<module>
<place>yyyy</place>
<name>janiiiii</janii>
</module>
假设搜索是 ,我需要在搜索 . & 之间的线条会有所不同,它们不是静态的。因此,一旦找到名称,我需要返回到模块行并开始阅读它。
请找到以下代码:
from itertools import islice
lastiterline=none
line_num=0
search_phrase="Janiii"
with open ('c:\sample.txt',"rb+") as f:
for line in f:
line_num+=1
line=line.strip()
if line.startswith("<module>"):
lastiterline=line
linec=line_num
elif line find(search_phrase)>=0:
if lastiterline:
print line
print linec
这有助于我获取与单词对应的模块的行号 searched.But 我无法将指针移回以重新开始从模块中读取行。会有多个搜索短语,所以每次我需要返回到那一行而不破坏 main for,它会读取整个大文件。
例如:可能有 100 个模块标签,里面可能有 10 个我想要的搜索短语,所以我只需要这 10 个模块标签。
好的,这是给你的例子,所以你可以更具体地说明你的需要。
这是您的示例 huge_file.txt
:
wgoi jowijg
<start tag>
wfejoije jfie
fwjoejo
THE PHRASE
jwieo
<end tag>
wjefoiw wgworjg
<start tag>
wjgoirg
<end tag>
<start tag>
wfejoije jfie
fwjoejo
woeoj
jwieo
THE PHRASE
<end tag>
还有一个脚本read_prev_lines.py
:
hugefile = open("huge_file.txt", "r")
hugefile = hugefile.readlines()
start_locations = []
current_block = -1
for idx, line in enumerate(hugefile):
if "<start tag>" in line:
start_locations.append({"start": idx})
current_block += 1
if "THE PHRASE" in line:
start_locations[current_block]["phr"] = idx
if "<end tag>" in line:
start_locations[current_block]["end"] = idx
#for i in phrase_locations:
for idx in range(len(start_locations)):
if "phr" in start_locations[idx].keys():
print("Found THE PHRASE after %d start tag(s), at line %d:" % (idx, start_locations[idx]["phr"]))
print("Here is the whole block that contains the phrase:")
print(hugefile[start_locations[idx]["start"]: start_locations[idx]["end"]+1])