[Python] Print next x lines from text file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mobb_Deep
  • Registratie: Juli 2007
  • Laatst online: 13-06 22:01
Goedendag,

De situatie is als volgt op mijn Ubuntu server.

Ik heb een tekst bestand met resultaten van een nslookup. Sommige resultaten zijn positief, sommige negatief. Nu wil ik de positieve resultaten weer opslaan in een nieuw tekst bestand.

Layout huidige textbestand: (ip adressen aangepast)...

code:
1
2
3
4
5
6
7
8
9
10
11
12
** server can't find 1.234.567.89.in-addr.arpa.: XXDOMAIN
Server:         111.11.11.25
Address:        111.11.23.43#55

Non-authoritative answer:
2.345.678.99.in-addr.arpa       name = name.server.nl

Authoritative answers can be found from:
2.345.678.99.in-addr.arpa nameserver = ns2.domain.nl.
2.345.678.99.in-addr.arpa nameserver = ns1.domain.nl.
Server:         555.44.33.22
Address:        555.44.33.22#11


Nu heb ik de volgende code:

Python:
1
2
3
4
5
6
7
8
9
#!/bin/usr/python

file = open('/tmp/results_nslookup.txt', 'r')
f = file.readlines()

for positives in f:
        if 'Authoritative answers can be found from:' in positives:
                print positives
file.close()


Met als resultaat dat hij in het tekst bestand x keer mijn string vindt en deze afdrukt.

Mijn doel is:
if de string is gevonden, print de volgende 7 lines van dat punt in het text bestand en ga vervolgens verder met zoeken tot end of file.

Heel ervaren ben ik nog niet met Python maar ik doe mijn best. Ik heb inmiddels 2 dagen gegoogeld maar het is mij nog niet gelukt...

Alvast bedankt!

De glazen horen klinken, maar niet weten waar de tap is.


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys, os

def main():
  lookup = file('nslookupfile')

  auth = False
  for line in lookup.readlines():
    if 'Authoritative answers can be found from:' in line:
      auth = True
      continue

    if auth:
      print line[:-1]   # cut of \n

if __name__ == '__main__':
  main()


Heb het niet getest, maar dit lijkt mij beter. Je loopt de regels af, en begint pas met printen na de regel met "Authoritative answers".

Edit: dit script werkt. Ben zelf ook Python aan het leren en wilde het wel even uitproberen.

[ Voor 28% gewijzigd door JayVee op 02-10-2012 12:42 ]

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • Mobb_Deep
  • Registratie: Juli 2007
  • Laatst online: 13-06 22:01
Thanks voor de snelle response. Echter werkt het niet zoals ik wil. Ik heb mijn post een beetje aangepast om het wat duidelijker te maken.

Als die tekst (Authoritative answers can be found from:) gevonden is. Print de daaropvolgende 7 lines van dat tekst bestand vanaf dat punt en ga weer verder tot end of file.

Ik had me code aangepast naar:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/usr/python

file = open('/tmp/results_nslookup.txt', 'r')
f = file.readlines()

check = False
for positives in f:
        if 'Authoritative answers can be found from:' in positives:
                check = True
                if check:
                        print positives[:-1]
                        continue
file.close()

Maar hetzelfde resultaat krijg ik met:
code:
1
2
3
4
5
6
7
8
9
10
#!/bin/usr/python

file = open('/tmp/results_nslookup.txt', 'r')
f = file.readlines()

for positives in f:
        if 'Authoritative answers can be found from:' in positives:
                        print positives[:-1]
                        continue
file.close()


Ik denk dat die continue wel beter is, echter moet hij nu nog even de volgend 7 lines printen. Maar hier komt het tekort aan kennis van mijn kant naar boven :'( ..

[ Voor 60% gewijzigd door Mobb_Deep op 02-10-2012 14:10 ]

De glazen horen klinken, maar niet weten waar de tap is.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:25
Ik wil het niet helemaal weggegeven, maar op basis van je aanpak om eerst alle regels in te lezen, hoef je helemaal niet met een lus te beginnen Je algoritme komt immers neer op:
  1. Zoek de regel met de tekst Authorative answers...
  2. Print maximaal zeven daaropvolgende regels
De eerste stap kun je uitvoeren met:
Python:
1
i = lines.index("Authorative...from:\n")


De tweede stap kun je het makkelijkst met slicing uitvoeren:
Python:
1
2
for line in lines[i+1:i+8]:
    print line,

(Merk op dat regels ingelezen met readline() op een newline eindigen — behalve mogelijk de laatste regel!)



Een compleet andere aanpak die mijn eerste voorkeur zou hebben, is om wel één keer door het bestand te lopen met een top-level lus als:
Python:
1
2
for line in open("somefile.txt"):
    # do something

... omdat je dan grote bestanden niet geheel in het geheugen hoeft te laden. Maar voor jouw toepassing is dat niet zo relevant, denk ik, dus probeer die eerst maar werkend te krijgen.



Misschien is het trouwens ook aardig om te vermelden wat je uiteindelijke doel precies is; als je simpelweg een DNS lookup wil doen vanuit Python kun je gewoon socket.gethostbyname("foobar.baz") gebruiken. (Maar los daarvan is het wel nuttig om dit soort simpele programmeerproblemen op te kunnen lossen natuurlijk.)

[ Voor 13% gewijzigd door Soultaker op 02-10-2012 16:40 ]


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Misschien is er iets misgegaan met je copy paste, maar let op whitespace in Python!
Python:
1
2
3
4
5
check = False
if True:  # hier iets zinnigs uiteraard
    check = True
    if check:
        print 'yes!'

en
Python:
1
2
3
4
5
check = False
if True:  # hier iets zinnigs uiteraard
    check = True
if check:
    print 'yes!'

Zijn twee verschillende dingen in Python!

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • Mobb_Deep
  • Registratie: Juli 2007
  • Laatst online: 13-06 22:01
Bedankt voor de dubbele gouden tip, eerst dit maar even werkend krijgen en daarna zal ik met socket.gethostbyname("foobar.baz") aan de bak gaan, had m even getest en dat ziet er goed uit!

Ik heb nu:
Python:
1
2
3
4
5
6
7
8
9
10
11
#!/bin/usr/python

file = open('/tmp/results_nslookup.txt', 'r')
lines = file.readlines()

i = lines.index('Authoritative answers can be found from:\n')

for line in lines[i-0:i+9]:
        print line,

file.close()

Echter print hij nu alleen mijn 1e resultaat netjes af, maar er staan nog 3 andere resultaten in het tekst bestand die hij overslaat. Ik ben vandaag een dag mee bezig geweest maar heb nog niet het gewenste resultaat :z. Nadat het script het 1e resultaat heeft gevonden moet het script doorgaan met zoeken en elke keer vanaf het punt dat het script een hit heeft weer de volgende 9 regels afdrukken... Iemand suggesties?

De glazen horen klinken, maar niet weten waar de tap is.


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16:09

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Kan je die .index functie geen startpunt meegeven vanaf waar hij moet zoeken? Alternatief is om het deel dat je gehad hebt er af te knippen en dan opnieuw te beginnen.

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
optie 1:
code:
1
i = lines[i_last:].index('...')


optie 2:
code:
1
blocks = f.read().split('Authoritative answers can be found from:\n')


optie 3:
code:
1
2
3
4
lines = f.readlines()
for i,line in enumerate(lines):
    if "Auth..." in line:
        print lines[i+1:i+8]


optie 4:
code:
1
2
3
4
5
6
line = f.readline()
while line:
    if "Auth..." in line:
        for i in range(7):
            print f.readline(),
    line = f.readline()


optie 5:
code:
1
2
3
4
5
i = iter(open('data.txt'))
for line in i:
    if "auth..." in line:
        for i in range(7):
            print i.next()


Ze gaan overigens niet allemaal hetzelfde om met de mogelijkheid dat je tekst 'Authoritative ...' binnen de 7 regels die je wilt printen nóg een keer voorkomt.

[ Voor 48% gewijzigd door ValHallASW op 03-10-2012 17:44 ]


Acties:
  • 0 Henk 'm!

  • Mobb_Deep
  • Registratie: Juli 2007
  • Laatst online: 13-06 22:01
Luitjes bedankt, de uiteindelijke oplossing voor mijn probleem:

code:
1
2
3
4
5
6
with open('/tmp/results_nslookup.txt', 'r') as f:
    lines = iter(f.readline, '')
    for line in lines:
        if line == 'Non-authoritative answer:\n':
            for i in range(8):
                print lines.next()

:)

De glazen horen klinken, maar niet weten waar de tap is.

Pagina: 1