我想從一個大的 gzipped 日志檔案中獲取最后一行,而不必對所有其他行進行迭代,因為這是一個大檔案。
我讀過用Python列印讀入檔案的最后一行,特別是這個答案,它適用于大檔案,但對gzipped檔案不起作用。的確,我試過:
import gzip
with gzip.open(f, 'rb') as g:
g.seek(-2, os.SEEK_END)
while g.read(1) != b'
'。 # 繼續向后讀,直到找到下一個斷裂線。
g.seek(-2, os.SEEK_CUR)
print(g.readline().decode())
但是在我非常標準的筆記本電腦上,一個10MB的壓縮檔案/130MB的解壓縮檔案已經需要80多秒了!
問題:如何用Python有效地尋找一個壓縮檔案的最后一行?側記:如果沒有壓縮,這個方法非常快:130MB的檔案只需1毫秒。
import os, time
t0 = time.time()
with open('test'/span>, 'rb'/span>) as g:
g.seek(-2, os.SEEK_END)
while g.read(1) != b'
'。
g.seek(-2, os.SEEK_CUR)
print(g.readline().decode())
print(time.time() - t0)
uj5u.com熱心網友回復:
如果你不能控制gzip檔案的生成,那么就沒有辦法在不解碼所有行的情況下讀取未壓縮資料的最后一行。它所花費的時間將是 O(n),其中 n 是檔案的大小。沒有辦法讓它變成 O(1)。
如果你確實在壓縮端有控制權,那么你可以創建一個便于隨機訪問的 gzip 檔案,你也可以跟蹤隨機訪問的入口點,以便能夠跳轉到檔案的末端。
uj5u.com熱心網友回復:
速度慢可能是由于在回圈中多次呼叫seek。
所以這個只有一個seek的解決方案是可行的:
with gzip.open(f, 'rb') as g:
g.seek(-1000, os.SEEK_END) # 在結束前走1000位元組。
l = g.readlines()[-1].decode() # 最后一行。
注意:
g.readlines()在這里是快速的,因為它只把最后的1000個位元組分割成行- 根據你的檔案中可能出現的最長的行來改變1000 。
仍然在尋找一個更好的解決方案。這是個鏈接,但并沒有給出一個真正的解決方案來獲得最后一行。在Python中讀取大檔案的懶惰方法?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/310463.html
標籤:
