2016-10-12 4 views
2

Ich bin ein Anfänger mit Python. Ich habe versucht, das Problem zu lösen: "Wenn wir eine Datei mit < 1000 Zeilen haben, wie nur die ungeraden Zeilen drucken?". Das ist mein Code:Fehler mit .readlines() [n]

with open(r'C:\Users\Savina\Desktop\rosalind_ini5.txt')as f: 
    n=1 
    num_lines=sum(1 for line in f) 
    while n<num_lines: 
     if n/2!=0: 
       a=f.readlines()[n] 
       print(a) 
     break 
    n=n+2 

wo n ist ein Zähler und num_lines berechnet, wie viele Zeilen der Datei enthält. Aber wenn ich versuche, den Code auszuführen, heißt es:

"a=f.readlines()[n] 
IndexError: list index out of range" 

Warum es nicht n als Zähler erkennt?

+0

Was das bedeutet ' [n] sollte bedeuten? –

+2

Nach dem ersten 'for line in f' hast du schon die ganze Datei gelesen und das Ende erreicht. Da Sie sich am Ende der Datei befinden, gibt 'f.readlines()' eine leere Liste zurück. Sie sollten nur einmal die Zeilen lesen. – khelwood

+0

In den Tutorials, die ich gelesen habe, sagten sie: "Wenn Sie eine bestimmte Zeile benötigen, können Sie einen Listeneintrag verwenden, zB f.readlines() [2] gibt die dritte Zeile des Dateiobjekts f" zurück, also habe ich diese Konstruktion benutzt. –

Antwort

2

Sie haben den Anruf zu readlines in eine Schleife, aber das ist nicht die beabsichtigte Verwendung, weil readlines die gesamte Datei auf einmal aufnimmt, Rückkehr Sie eine LIST von Newline Strings beendet.

Möglicherweise möchten Sie eine solche Liste speichern und arbeiten auf es

list_of_lines = open(filename).readlines() # no need for closing, python will do it for you 
odd = 1 
for line in list_of_lines: 
    if odd : print(line, end='') 
    odd = 1-odd 

Zwei Bemerkungen:

  1. odd zwischen 1 abwechselnd (daher der Fall, wenn Argument eines if) oder 0 (daher false wenn Argument einer if),
  2. das optionale Argument end='' an die print Funktion n ist erforderlich, da jede Zeile in list_of_lines mit einem neuen Zeilenzeichen abgeschlossen wird. Wenn Sie das optionale Argument weglassen, gibt die Funktion print ein ZWEITES Zeilenzeichen am Ende jeder Zeile aus.

, um Ihren Code Kommen wir zurück, können Sie sein Verhalten beheben eine

f.seek(0) 

vor der Schleife mit der Datei zu seiner Anfangsposition zurückzuspulen und mit der f.readline() (aussehen, es NICHT readline**S** ist) Methode innerhalb der Schleife, aber seien Sie versichert, dass der Prozess wie folgt ist. sagen wir mal, ein bisschen unkonventionell ...

Schließlich ist es möglich, mit einem Einzeiler alles, was Sie tun wollen

print(''.join(open(filename).readlines()[::2])) 

, die die slice notation for list s verwendet und die string method .join()

0

Nun, würde ich es persönlich wie folgt aus:

def print_odd_lines(some_file): 
    with open(some_file) as my_file: 
     for index, each_line in enumerate(my_file): # keep track of the index of each line 
      if index % 2 == 1: # check if index is odd 
       print(each_line) # if it does, print it 

if __name__ == '__main__': 
    print_odd_lines('C:\Users\Savina\Desktop\rosalind_ini5.txt') 

Seien Sie sich bewusst, dass dies eine leere Zeile anstelle der geraden Zahl verlassen wird. Ich bin mir sicher, dass Sie herausfinden, wie Sie es loswerden können.

0

Dieser Code wird genau das tun, wie Sie gefragt:

with open(r'C:\Users\Savina\Desktop\rosalind_ini5.txt')as f: 
    for i, line in enumerate(f.readlines()): # Iterate over each line and add an index (i) to it. 
     if i % 2 == 0:  # i starts at 0 in python, so if i is even, the line is odd 
      print(line) 

Um zu erklären, was in Ihrem Code passiert:

Eine Datei kann nur einmal durchlesen werden. Danach muss es wieder geschlossen und wieder geöffnet werden.

Sie durchlaufen zuerst die gesamte Datei unter num_lines=sum(1 for line in f). Jetzt ist das Objekt f leer.

Wenn n jedoch ungerade ist, rufen Sie f.readlines(). Dies wird wieder alle Zeilen durchlaufen, aber keine sind in f übrig. Jedes Mal, wenn n ungerade ist, durchläuft man die gesamte Datei. Es ist schneller, es einmal zu durchlaufen (wie in den Lösungen, die für Ihre Frage angeboten werden).

+0

Dadurch werden die geraden Zeilen gedruckt :) –

+0

In seinem Code beginnt er mit 'n = 1'. Daraus interpretiere ich, dass er die erste Zeile aufruft, was Python die nullte Zeile nennt. Daher wird als Antwort auf seine Frage das ausgegeben, was er als eine ungerade Zeilennummer definiert. –

0

Als fix, müssen Sie

f.close() 
f = open(r'C:\Users\Savina\Desktop\rosalind_ini5.txt') 

jedes Mal eingeben, nachdem Sie die Datei durchlesen, um den Start zu kommen.

Als Randnotiz sollten Sie nach modolus% suchen, um ungerade Zahlen zu finden.

Verwandte Themen