2017-01-08 4 views
0

によってテキストの段落を読むために私はPythonの初心者だと私はイテレータメソッドを使用して、段落することにより、EXAMPLE.SQLファイルの段落を読みしようとしています。問題は、forループやline = next(it)を使わずに次のメソッドで行ごとに読み込む方法を理解できないことです。どんな助けでも大歓迎です。ここまでは私が今まで持っているものです。Pythonのどの段落

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

どのように間違っているか説明できますか? '\ n'だけを含む行をたどるまで、' __next__'で行を読んでおきたいと思うでしょう。実際にはジェネレータ関数を使うほうが簡単かもしれませんが、イテレータを使うことを学ぶのはポイントですか? –

+0

'nltk'にはこの機能が組み込まれています – inspectorG4dget

+0

@PaulRooneyはい、まさに私がやろうとしていることです。 __nextの行を読んでください__私はいつもループを使いますが、私はその方法でそれをしなくてはならないと思います...そしてそうです、それがポイントですが、結果なしでたくさんのことを試みました。 – Sofia

答えて

1

だから、これはファイルのイテレータ(f)であるため、実際には、すなわちあなたがnext(self.text)を呼び出す必要があり、self.textを消費する必要があります。あなたは空白を受け取るまで、これを複数回呼び出す必要があるので、ループが必要です。 forループは例えばので、これは動作するはずnext(self.text)を呼び出します。:

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) 

forループはきれいそうStopIterationの出口がelse句を入力しますします。最後の段落がないことを避けるためにparがない場合にのみStopIterationを上げる必要があります。

+0

ありがとう! :D何らかの理由で、私は__next__メソッドでループを必要としないことを期待していました。 – Sofia