[python] bepaalde regels van bestand lezen

Pagina: 1
Acties:
  • 723 views sinds 30-01-2008
  • Reageer

  • Boertje
  • Registratie: September 2001
  • Laatst online: 12-04 22:01
*Ik heb gezocht maar kon er niets over vinden

Is het mogelijk om op een simpele manier bijv. de laatste 10 regels van een bestand uit te lezen? (ben python noob)
maar kreeg het niet voor elkaar, heb van alles geprobeerd. :?

  • André
  • Registratie: Maart 2002
  • Laatst online: 11:30

André

Analytics dude

Wat heb je geprobeerd dan? Wat lukt niet precies?

  • Hagar
  • Registratie: Februari 2001
  • Laatst online: 14-10-2025

Hagar

Diabootic

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
import sys

fp = open(sys.argv[0])
for line in fp.readlines()[-10:]:
    print line,

# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10

:+

Nu ook zonder stropdas


  • Boertje
  • Registratie: September 2001
  • Laatst online: 12-04 22:01
ik heb een bestand geopend, laten we zeggen auth.log waar ik de laatste 10 regels uit wil hebben.
nou kan ik het hele bestand door lopen en de regels tellen en vervolgens nog een keer het hele bestand door lopen en de laatste 10 regels afdrukken maar dat lijkt me dubbel werk dat moet sneller kunnen lijkt me :)

  • Boertje
  • Registratie: September 2001
  • Laatst online: 12-04 22:01
bedankt Hagar, dat was wat ik zocht B)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-04 03:15
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:
  1. 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.
  2. 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.
  3. 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.

Verwijderd

Ik weet niet of je die 10 regels nodig hebt als gebruiker, of ze verder wilt bewerken in je programma... maar in het eerste geval is het wiel al eens uitgevonden:

Het UNIX-commando tail doet precies wat je wilt.

Ik neem aan dat je Windows gebruikt, anders had je het vast wel gekend. Een Windows-versie van tail (en nog veel meer) is hier te vinden.
Pagina: 1