2017-01-08 5 views
0

Ich bin ein Python Anfänger und ich versuche, die Datei example.txt Absatz für Absatz mit den Iterator und nächsten Methoden zu lesen. Das Problem ist, ich kann nicht herausfinden, wie Zeile für Zeile in der nächsten Methode zu lesen, ohne eine for-Schleife oder Zeile = next (it). Jede Hilfe würde sehr geschätzt werden. Hier ist, was ich bis jetzt habe.Python, wie man Text Absatz nach Absatz liest

class ByParagraph: 


    def __init__(self, text): 
     self.text = text 


    def __iter__(self): 
     return self 
     par = "" 


    def __next__(self): 
     par = "" 
     if (I still need to decide how to stop the iterations): 
      raise StopIteration 

     if str(self.text).isspace(): 
      return par.strip() 
     else: 
      return ' '.join([par, str(self.text)]) 



with open("example.txt") as f: 
    for par in ByParagraph(f): 
     print('BEGIN PAR' + par + 'END PAR') 
+0

Können Sie beschreiben, wie es schief geht? Ich würde mir vorstellen, dass Sie wahrscheinlich Zeilen in "__next__" lesen möchten, bis Sie eine Zeile treffen, die nur '\ n' enthält. Es könnte tatsächlich einfacher sein, einfach eine Generatorfunktion zu verwenden, oder ist es an der Zeit, Iteratoren zu lernen? –

+0

'nltk' hat diese Funktionalität integriert – inspectorG4dget

+0

@PaulRooney ja, das ist genau das, was ich versuche zu tun. Lies die Zeilen in __next __ Ich benutze immer eine Schleife, aber ich glaube nicht, dass ich das in der Methode machen muss ... und ja, das ist der Punkt, aber ich habe viele Dinge ohne Ergebnis ausprobiert. – Sofia

Antwort

1

Sie müssen also tatsächlich verbrauchen self.text weil dies eine Datei Iterator (f), das heißt Sie müssen next(self.text) nennen. Sie müssen dies mehrmals aufrufen, um alle Zeilen zu verwenden, bis Sie ein Leerzeichen erhalten, so dass Sie eine Schleife benötigen. Eine for Schleife ruft next(self.text) so sollte diese Arbeit, z.B .:

def __next__(self): 
    par = [] 
    for line in self.text: 
     if line.isspace(): 
      break 
     par.append(line.strip()) 
    else: 
     if not par: 
      raise StopIteration() 
    return ' '.join(par) 

Die for Schleife sauber Ausfahrt auf StopIteration so die else Klausel eingeben. Sie sollten StopIteration nur erhöhen, wenn es keine par gibt, um zu vermeiden, den letzten Absatz zu verpassen.

+0

oh danke! : D Aus irgendeinem Grund erwartete ich, dass ich keine Schleife in der __next__ Methode brauche. – Sofia