Ich habe ein file
-Objekt, das im universellen Modus geöffnet sein kann oder nicht. (Ich kann auf diesen Modus mit file.mode
zugreifen, wenn das hilft).
Ich möchte mit dieser Datei arbeiten, indem ich die Standardmethode io
: read
und seek
.
Wenn ich die Datei im nicht-universellen Modus öffne, funktioniert alles gut:
%Vor%Wenn ich die Datei jedoch im universellen Modus öffne, haben wir ein Problem:
%Vor% Python interpretiert \r\n
als \n
und gibt eine Zeichenfolge der Länge 8 zurück.
Beim Erstellen dieser Zeichenfolge wurde jedoch 9 Byte aus der Datei gelesen.
Wenn wir versuchen, die read
mit seek
umzukehren, kehren wir nicht zu dem Ausgangspunkt zurück!
Gibt es eine Möglichkeit zu identifizieren, dass wir eine 2-Byte-Newline verbraucht haben oder, noch besser, dieses Verhalten deaktivieren?
Das Beste, was ich mir im Moment vorstellen kann, ist, vor und nach dem Lesen ein tell
zu machen und zu überprüfen, wie viel tatsächlich ist, aber das scheint unglaublich unelegant.
Nebenbei bemerkt scheint mir, dass dieses Verhalten der Dokumentation von read
entgegensteht:
Dies deutet darauf hin, dass höchstens Bytes Bytes gelesen sein sollten, nicht zurückgegeben .
Insbesondere glaube ich, dass die korrekte Semantik des obigen Beispiels sein sollte:
%Vor%Missverstehe ich die Dokumentation?
Was versuchst du wirklich?
Wenn Sie nach vorne und dann nach rückwärts suchen, weil Sie zu einem bestimmten Punkt in der Datei zurückkehren möchten, verwenden Sie tell (), um aufzuzeichnen, wo Sie sich befinden. Das ist einfacher als zu verfolgen, wie viele Bytes Sie lesen.
%Vor%Ich führe hier eine Problemumgehung in einer Antwort auf, obwohl ich keineswegs zufrieden bin.
Da das zugrunde liegende Problem die Diskrepanz zwischen der Länge eines \n
im Universalmodus und der Anzahl der Bytes ist, die es tatsächlich in der Datei darstellt, besteht eine Möglichkeit zur Vermeidung des Fehlers darin, aus einem Zwischenstrom zu lesen \n
repräsentiert tatsächlich ein Byte:
Das neue Objekt io
, das von wrap_stream
zurückgegeben wurde, zeigt Zeilenumbrüche als \n
, unabhängig davon, in welchem Modus die Datei geöffnet wurde.
Wäre es akzeptabel, fdopen zu verwenden, um ein neues Dateiobjekt für den vorhandenen Deskriptor zu erhalten, aber ohne den störenden U-Modus, und den für das Suchen zu verwenden? Zum Beispiel:
%Vor%So können Sie die Datei in jedem beliebigen Modus für sich arbeiten lassen, ohne sie schließen und in diesem Modus wieder öffnen zu müssen.