Io.BufferedReader peek Funktion, die den ganzen Text in den Puffer zurückgibt

Ich verwende Python 3.4.1 unter Windows 8.

Ich würde gerne eine Datei mit einer gepufferten Schnittstelle lesen, die mir erlaubt, eine bestimmte Anzahl von Bytes vor zu sehen, wie auch Lese-Bytes. io.BufferedReader scheint wie die richtige Wahl.

Leider scheint io.BufferReader.peek nutzlos zu sein, weil es scheint, einfach alle Bytes zurückzugeben, die im Puffer gespeichert sind, anstatt die angeforderte Nummer. In der Tat ist dies erlaubt durch die Dokumentation dieser Funktion (Schwerpunkt Mine):

Peek ([size]) Rückkehr Bytes aus dem Stream ohne Fortschritte der Position. Höchstens ein einziges Lesen auf dem Rohstrom wird getan, um den Anruf zu befriedigen. Die Anzahl der zurückgegebenen Bytes kann weniger oder mehr als angefordert sein.

Um zu zeigen, was ich für nutzloses Verhalten halte, habe ich die folgende Testdatei namens Test1.txt :

 first line second line third line 

Ich schaffe das io.BufferedReader Objekt wie dieses in IDLE:

 >>> stream = io.BufferedReader(io.FileIO('Test1.txt')) 

Und dann um zwei Bytes bitten,

 >>> stream.peek(2) b'first line\r\nsecond line\r\nthird line' 

Eh Das ist nur der ganze Text in der Standard-Puffergröße (das ist 8192 Bytes auf meinem System). Wenn ich diese Vorgabe ändere, kann ich bestätigen, dass peek() gerade den Inhalt des Puffers zurückgibt,

 >>> stream2 = io.BufferedReader(io.FileIO('Test1.txt'), buffer_size=2) >>> stream2.peek(17) b'fi' >>> stream2.peek(17) b'fi' >>> stream2.read(2) b'fi' >>> stream2.peek(17) b'rs' 

Um klar zu sein, das folgende ist die Ausgabe, die ich erwarten zu sehen :

 >>> stream = io.BufferedReader(io.FileIO('Test1.txt')) >>> stream.peek(2) b'fi' >>> stream.read(1) b'f' >>> stream.peek(2) b'ir' 

Das ist ein typischer gepufferter Strom.

Was mache ich falsch beim Konstruieren dieses BufferedReader ? Wie kann ich das Verhalten beobachten, das ich in Python 3.4.1 sehen werde?

  • Mysql Befehl aus Synchronisierung bei der Ausführung von Insert aus Sellerie
  • Warum kommt es zu -2?
  • Django: mehrere Modelle in einer Vorlage mit Formularen
  • Regex funktioniert gut auf Pythex, aber nicht in Python
  • Python Selen + Datepicker Klicken Sie auf
  • App Engine Dev Server: schlechter Laufzeitprozess Port [''] Kein Modul namens google.appengine.dist27.threading
  • Kopiere einen Bereich von Pixeln
  • Berechnen der Anzahl der Vorkommen und Eingabe und Anhängen an csv
  • One Solution collect form web for “Io.BufferedReader peek Funktion, die den ganzen Text in den Puffer zurückgibt”

    .peek() ist in der Tat implementiert als Rückgabe des aktuellen Puffers; Wenn du es mit .read() Anrufen kombinierst, .read() du feststellen, dass immer weniger der Puffer zurückgegeben wird, bis der Puffer wieder aufgefüllt ist.

    Für die meisten Zwecke von .peek() ist das mehr als gut. Mit der Anzahl der Bytes können Sie festlegen, wieviel Daten von der zugrundeliegenden I / O-Quelle erwartet werden, wenn der Puffer leer ist, was wiederum wichtig ist, wenn diese Quellblöcke liest.

    Einfach den Rückgabewert schneiden:

     stream.peek(num)[:num] 
    Python ist die beste Programmiersprache der Welt.