2011-01-24 10 views

Odpowiedz

45
searchfile = open("file.txt", "r") 
for line in searchfile: 
    if "searchphrase" in line: print line 
searchfile.close() 

Aby drukować wiele linii (w łatwy sposób)

f = open("file.txt", "r") 
searchlines = f.readlines() 
f.close() 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     for l in searchlines[i:i+3]: print l, 
     print 

przecinek print l, zapobiega pojawianiu spacji na wyjściu; końcowe polecenie drukowania wyznacza wyniki z różnych linii.

Albo jeszcze lepiej (kradzież z powrotem Mark Ransom):

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     for l in searchlines[i:i+3]: print l, 
     print 
+1

zamknij plik po przetworzeniu. – Rozuur

+2

Jak wydrukować tę linię i trzy inne linie poniżej? –

+0

@Rozuur: Wystarczająco fair. edytowane. – senderle

19
with open('file.txt', 'r') as searchfile: 
    for line in searchfile: 
     if 'searchphrase' in line: 
      print line 

z przeprosinami do senderle kto ja rażąco kopiowane.

+2

+1. Byłem zirytowany - ale potem poświęciłem chwilę, aby zrozumieć wypowiedź. To jest świetne! – senderle

+3

@senderle, dzięki za to. Zastanawiałem się tylko nad zredagowaniem twojej odpowiedzi, ale myślałem, że będzie to jeszcze bardziej irytujące - a wyrażenie 'with' jest raczej nowym dodatkiem do Pythona, co sprawia, że ​​twoja odpowiedź jest najbardziej odpowiednia dla niektórych osób. Masz +1 dawno temu! –

+1

tak, ostatnie i dla mnie, tajemnicze, dodawanie, aż do teraz; Muszę przyznać, że kilka tygodni temu starałem się zignorować to stwierdzenie i nie doszedłem do skutku - ale ten prosty przykład doskonale to wyjaśnia. – senderle

2

Zwróć uwagę na potencjał indeksu spoza zakresu z "i + 3". Możesz zrobić coś takiego:

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
j=len(searchlines)-1 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     k=min(i+3,j) 
     for l in searchlines[i:k]: print l, 
     print 

Edytuj: może nie jest konieczne. Właśnie przetestowałem kilka przykładów. x [y] daje błędy, jeśli y jest poza zakresem, ale x [y: z] nie wydaje się dawać błędów dla wartości spoza zakresu y i z.

+0

Krojenie nie powoduje błędów poza zakresem. Kiedy bierzesz plasterek, mówisz "podaj listę przedmiotów z tego zakresu". Jeśli w podanym zakresie nie ma żadnych elementów, to pusta lista dostarcza tego, o co prosiło. Z drugiej strony indeksowanie mówi "podaj mi dokładną pozycję w indeksie" i "." Jeśli nie ma elementu w 'i', to zwracanie czegoś - nawet" Brak "- byłoby kłamstwem, więc lepiej jest podnieść wyjątek. – senderle

Powiązane problemy