Wie verwende ich primitive io (suchen, lesen) im Dateistrom, der im universellen Modus sein könnte?

9

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 .

verwende

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:

%Vor%

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?

    
sapi 28.06.2014, 11:12
quelle

3 Antworten

1

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%     
Colin Phipps 13.07.2014 08:32
quelle
0

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:

%Vor%

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.

    
sapi 29.06.2014 01:27
quelle
0

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.

    
Jeff Clough 20.08.2014 19:40
quelle

Tags und Links