Sytuacja jest następująca:

Mam plik .txt z wynikami kilku nslookups.

Chcę pętli do pętli pliku i za każdym razem, gdy uderza w ciągu "nie-autorytatywna odpowiedź:" Skrypty muszą wydrukować następujące 8 linii z tej pozycji. Jeśli to działa, zdobądź wszystkie pozytywne wyniki na moim ekranie :).

Najpierw miałem następujący kod:

#!/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()

Ale że tylko wydrukowane "autorytatywne odpowiedzi można znaleźć od:" Czasu było w .txt.

Kod, co mam teraz:

#!/bin/usr/python

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

i = lines.index('Non-authoritative answer:\n')

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

file.close()

Ale kiedy go uruchomię, nadrukuje pierwszy wynik na moim ekranie, ale nie drukuje innych wyników Positve.

Str.s. Jestem świadomy socket.GethostbyName ("foobar.baz"), ale najpierw chcę rozwiązać ten podstawowy problem.

Z góry dziękuję!

5
Mobb Deep 4 październik 2012, 16:29

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć pliku jako iteratora, a następnie wydrukuj następne 8 linii za każdym razem, gdy znajdziesz zdanie:

with open('/tmp/results_nslookup.txt', 'r') as f:
    for line in f:
        if line == 'Non-authoritative answer:\n':
            for i in range(8):
                print(next(lines).strip())

Za każdym razem, gdy używasz next() Funkcja Obiekt (lub pętla nad nim w pętli for), powróci kolejny wiersz w tym pliku, aż przeczytasz ostatnią linię.

Zamiast range(8) dla pętli, używałbym itertools.islice:

from itertools import islice

with open('/tmp/results_nslookup.txt', 'r') as f:
    for line in f:
        if line == 'Non-authoritative answer:\n':
            print(''.join(islice(f, 8)))
7
Martijn Pieters 24 sierpień 2018, 19:14
file = open('/tmp/results_nslookup.txt', 'r')
for line in file:
    if line=='Non-authoritative answer:\n':
        for _ in range(8):
            print file.next()

Przy okazji: Nigdy nie używaj nazwy file dla zmiennej, ponieważ jest to nazwa wbudowanej funkcji.

4
nagylzs 4 październik 2012, 12:33