2016-10-18 3 views
-2

Pythonで後方移動入力クラスを作成するには?私は入力をクラスと呼びます。ファイルを読み込んで一度に1文字ずつ返すようになりました。これを逆向きに変更したいのですが。Pythonで逆方向に動く入力クラスを作成するには

# Buffered input file. Returns one character at a time. 


class Input: 

     def __init__(self, file): 
       self.file = file  # must open(<filename>, 'rb') 
       self.length = 0 
       self.used = 0 
       self.buffer = "" 

     def read(self): 
       if self.used < self.length:  # if something in buffer 
         c = self.buffer[self.used] 
         self.used += 1 
         return c 

       else: 
         self.buffer = self.file.read(2048) # or 2048 
         self.length = len(self.buffer) 
         if self.length == 0: 
           return -1 
         else: 
           c = self.buffer[0] 
           self.used = 1 
           return c 
+1

?ファイルの終わりから始めてのことですか? –

+0

FYI:http://www.python.org/dev/peps/pep-0008/ – jonrsharpe

+1

あなたの問題は何ですか?どんなコードを試しましたか?私たちはあなたのためにコードを書くことはまずありませんが、私たちはあなたのコードにエラーを表示することをうれしく思います。 –

答えて

0

私は、これは、Python 3でのテキストファイルを扱うことができる唯一の方法は、一度にファイルのテキスト全体を読んで、その後、あなたがロードされてきた文字列の末尾から文字を得るためにだと思います。テキストの任意の位置を安全に検索する方法がないため、ファイルを最後から読み取ることはできません。任意の地点(ファイルの最後の2048バイトなど)を選択した場合は、マルチバイト文字の中央に着陸する可能性があります。このため、Pythonでは、ファイルの開始位置と終了位置、または以前にあった場所(とtellの位置を保存した場所)以外にはseekを実行することはできません。

ファイルが十分に小さい場合は、私はこのような何かをお勧めしたい:ファイルを一度にメモリに保存するには大きすぎる場合には

class ReverseInput(): 
    def __init__(self, file): 
     buffer = file.read() # read all text 
     self.rev_iter = reversed(buffer) # save a reverse iterator into the text 

    def read(self): 
     try: 
      return next(self.rev_iter) 
     except StopIteration: 
      return -1 # raising an exception or returning "" might be a better API 

を、私はあなたがすることによって求めに制限を回避することができたとし限られたサイズのブロックを読み込み、破棄し、self.file.tell()を使用して、後で検索できる場所を保存します。おそらく、遅く、扱いにくく、簡単に邪魔されるでしょう。

+0

なぜメモリマップファイルを使用しないのですか?ファイルが大きすぎる場合は、検索してOSがページングを処理します。 – Basic

+0

@Basic:バイナリファイルにアクセスするにはうまくいくが、エンコードされたテキストを扱うことは依然として本当の苦痛である。 – Blckknght

+0

マルチキャラクタエンコーディングは常に問題ですが、UTF-8などを使用している場合、仕様は非常にうまく設計されており、これを可能にしています... https://www.youtube.com/watch?v= MijmeoH9LT4 – Basic

関連する問題