2016-06-28 25 views
14

Pythons os-Modul enthält einen Wert für eine bestimmte Leitung Plattform Trenn Zeichenfolge, aber die docs sagen ausdrücklich, es nicht zu verwenden, wenn Sie eine Datei zu schreiben:Wozu dient os.linesep?

als Zeilenendzeichen Verwenden os.linesep nicht beim Schreiben von Dateien im Textmodus geöffnet (Standard); Verwenden Sie stattdessen ein einzelnes \ n auf allen Plattformen.

Docs

Previous questions haben, warum Sie nicht es in diesem Zusammenhang verwendet werden erforscht, aber was dann Zusammenhang ist es geeignet? Wann sollten Sie den Zeilentrenner verwenden und wofür?

Antwort

7

die docs sagen ausdrücklich, es nicht zu verwenden, wenn Sie eine Datei zu schreiben

Dies ist nicht richtig, sagt der Doc nicht Modus in Text verwendet.

Die os.linesep wird verwendet, wenn Sie die Zeilen einer Textdatei durchlaufen möchten. Der interne Scanner erkennt die os.linesep und ersetzt sie durch ein einziges "\ n".

Zur Veranschaulichung, schreiben wir eine binäre Datei, die durch "\ r \ n" (Windows delimiter) 3 getrennt Zeilen enthält:

import io 

filename = "text.txt" 

content = b'line1\r\nline2\r\nline3' 
with io.open(filename, mode="wb") as fd: 
    fd.write(content) 

Der Inhalt der Binärdatei ist:

with io.open(filename, mode="rb") as fd: 
    for line in fd: 
     print(repr(line)) 

Hinweis: Ich habe den "rb" -Modus verwendet, um die Datei als Binärdatei zu lesen.

ich:

b'line1\r\n' 
b'line2\r\n' 
b'line3' 

Wenn ich den Inhalt der Datei mit dem Textmodus wie folgt lesen:

with io.open(filename, mode="r", encoding="ascii") as fd: 
    for line in fd: 
     print(repr(line)) 

ich:

'line1\n' 
'line2\n' 
'line3' 

Der Begrenzer wird durch "\ n" ersetzt.

Die os.linesep wird auch im Schreibmodus verwendet: beliebig "\ n" Zeichen an den System-Standardzeilentrenn umgewandelt werden: "\ r \ n" unter Windows "\ n" auf POSIX usw.

Mit der Funktion io.open können Sie den Zeilentrenner beliebig setzen.

Beispiel: wie man eine Windows-Textdatei schreiben:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd: 
    fd.write("one\ntwo\nthree\n") 

Wenn Sie diese Datei im Textmodus wie folgt lesen:

with io.open(filename, mode="rb") as fd: 
    content = fd.read() 
    print(repr(content)) 

Sie erhalten:

b'one\r\ntwo\r\nthree\r\n' 
4

Wie Sie wissen, konvertiert das Lesen und Schreiben von Dateien im Textmodus in Python das plattformspezifische Zeilentrennzeichen in '\ n' und umgekehrt. Wenn Sie jedoch eine Datei im Binärmodus lesen, findet keine Konvertierung statt. Dann können Sie die Zeilenenden explizit mit string.replace(os.linesep, '\n') konvertieren. Dies kann nützlich sein, wenn eine Datei (oder ein Stream oder was auch immer) eine Kombination aus Binär- und Textdaten enthält.

+0

Es wouldn Funktioniert nicht, wenn die Codierung inkompatibel ist. 'len ('\ n'.encode (' utf-16 '))' ist 4 –