Python - 如何打开文件并指定字节偏移量?

16 投票
8 回答
44998 浏览
提问于 2025-04-16 01:37

我正在写一个程序,定期解析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

你可以通过 seektell 这两个方法来管理文件中的位置,这些方法是 file 类的一部分。具体可以参考这个链接:https://docs.python.org/2/tutorial/inputoutput.html

tell 方法会告诉你下次打开文件时应该去哪里。

撰写回答