Dat is vrij lastig, omdat een bestand gewoon een serie bytes is en dat een indeling in regels (of velden in een csv-bestand bijvoorbeeld) vrij willekeurig is.
Er zijn verschillende manieren om het probleem aan te pakken:
- De methode die Hagar voorstelt: alle regels inlezen en dan de laatste 10 pakken. Kost veel geheugen en duurt lang als het bestand groot is, maar voor kleine bestanden werkt het prima en het is makkelijk te schrijven.
- Een vergelijkbare methode, waarbij je regel voor regel uitleest, en steeds de laatste 10 regels onthoudt. Je leest dan nog steeds het hele bestand in, dus het is nog steeds relatief traag, maar het kost weinig geheugen.
- Het bestand van achter naar voren inlezen tot je genoeg data hebt om 10 regels uit te halen.
Die derde methode is het meest efficient, maar vereist wel wat gepuzzel om 'm goed werkend te krijgen. Een voorbeeld:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| def last_lines(filepath, count):
f = file(filepath)
f.seek(0, 2)
filesize = f.tell()
size = 100
lines = []
while len(lines) <= count:
if size > filesize:
size = filesize
f.seek(-size, 2)
lines = f.read(size).rstrip('\n').split('\n')
if size == filesize:
break
size = size * 2
return lines[-count:] |
Merk op dat hier nog een aantal beperkingen aan zitten: lege regels aan het einde van het bestand worden overgeslagen en bepaalde delen van het bestand worden meer dan eens ingelezen. Echt problematisch hoeft dit niet te zijn - als de totale hoeveelheid data die je inleest maar klein is.