Python - 如何打开文件并指定字节偏移量?
我正在写一个程序,定期解析Apache的日志文件,以记录访客、带宽使用情况等等。
问题是,我不想每次打开日志文件时都解析已经解析过的数据。例如:
line1
line2
line3
如果我解析这个文件,我会保存所有的行,然后记录下这个位置。这样,当我第二次解析时,我就能得到:
line1
line2
line3 - The log will open from this point
line4
line5
第二次解析时,我会得到第4行和第5行。希望这样说能让你明白……
我想知道的是,我该怎么做到这一点?Python有一个叫seek()的函数,可以指定位置……所以我是不是在第一次解析后,获取日志文件的大小(以字节为单位),然后在第二次记录时用这个大小作为seek()的偏移量呢?
我似乎想不出什么好的方法来实现这个 >.<
8 个回答
1
如果你的日志文件可以轻松放进内存中(也就是说,你有一个合理的轮换策略),你可以很简单地做一些事情,比如:
log_lines = open('logfile','r').readlines()
last_line = get_last_lineprocessed() #From some persistent storage
last_line = parse_log(log_lines[last_line:])
store_last_lineprocessed(last_line)
如果你不能这样做,你可以使用类似的方法(可以参考接受的答案中关于使用 seek 和 tell 的部分,如果你需要用到它们的话) 用 Python 获取文件的最后 n 行,类似于 tail
4
log = open('myfile.log')
pos = open('pos.dat','w')
print log.readline()
pos.write(str(f.tell())
log.close()
pos.close()
log = open('myfile.log')
pos = open('pos.dat')
log.seek(int(pos.readline()))
print log.readline()
当然,你不应该这样使用它——你应该把这些操作放在像 save_position(myfile)
和 load_position(myfile)
这样的函数里,但这些功能都是可以实现的。
16
你可以通过 seek
和 tell
这两个方法来管理文件中的位置,这些方法是 file
类的一部分。具体可以参考这个链接:https://docs.python.org/2/tutorial/inputoutput.html
tell
方法会告诉你下次打开文件时应该去哪里。