我在python中有一个.log
文件。例如:
**** start logging ****
line 1
line 2
line 3
**** end logging ****
**** start logging ****
line 4
line 5
line 6
**** end logging ****
我想只读取并打印此文件的最后一次记录(写入**** start logging ****
时)。在我们的案例中:
**** start logging ****
line 4
line 5
line 6
**** end logging ****
据我所知。 python中的.read()
和.seek()
函数应该足以完成此任务。但正如我所见,seek()
只能获得偏移,而不是字符串变量。
如何只在此.log
文件中使用特定部分?
答案 0 :(得分:2)
您可以使用str.split
<强>演示强>
>>> content = '''**** start logging ****
... line 1
... line 2
... line 3
... **** end logging ****
... **** start logging ****
... line 4
... line 5
... line 6
... **** end logging ****'''
>>> ''.join(content.split('**** start logging ****')).replace('**** end logging ****','')
'\nline 1\nline 2\nline 3\n\n\nline 4\nline 5\nline 6\n'
答案 1 :(得分:1)
您只需要使用**** start logging ****
拆分文件,然后再将其添加到拆分列表的最后一个元素中!
with open('new.txt' ,'r') as f :
lines=f.read()
print "**** start logging ****"+ lines.split("**** start logging ****")[-1]
结果:
**** start logging ****
line 4
line 5
line 6
**** end logging ****
答案 2 :(得分:0)
您需要解析整个文件。
with open(logfile) as f:
for line in f:
if line.startswith('**** start logging'):
l = []
else:
l.append(line)
print('\n'.join(l[:-1]))
l中的最后一个条目是end logging
行,所以我明确删除了它。
或者,您可以使用file.seek(n, -2)
,其中n
是每个记录记录的字符数的猜测,但是您仍然需要执行一些迭代来获取整个记录,并检查只有一个短语的实例&#39;开始记录&#39;在其中,这意味着你无论如何都要执行上面的代码......
答案 3 :(得分:0)
你说的是读和寻,所以我想你不想在记忆中保留一大堆线。您可以简单地存储上次记录开始的位置并在那里回放:
with open(logfile) as fd:
last_log_start = None
while True:
line = fd.readline()
if line is None: break
if line.startswith('**** start logging'):
last_log_start = fd.tell()
if last_log_start is not None:
fd.seek(last_log_start)
while True:
line = fd.readline()
if line is None: break
if line.startswith('**** end logging'): break
sys.stdout.write(line)