Wie schreibe ich Unix-Zeilenendezeichen in Windows?

79

Wie kann ich mit Python (unter Windows) in Dateien schreiben und das Unix-Zeilenendezeichen verwenden?

zB wenn:

f = open ('file.txt', 'w')
f.write ('Hallo \ n')
f.close ()

Python ersetzt automatisch \nmit \r\n.

tttppp
quelle

Antworten:

65

Für Python 2 & 3

Siehe: Die moderne Art: Verwenden Sie auf dieser Seite newline = '' answer.

Nur für Python 2 (ursprüngliche Antwort)

Öffnen Sie die Datei als Binärdatei, um die Übersetzung von Zeilenendezeichen zu verhindern:

f = open('file.txt', 'wb')

Zitieren des Python-Handbuchs:

Unter Windows öffnet 'b', das an den Modus angehängt ist, die Datei im Binärmodus, daher gibt es auch Modi wie 'rb', 'wb' und 'r + b'. Python unter Windows unterscheidet zwischen Text- und Binärdateien. Die Zeilenendezeichen in Textdateien werden beim Lesen oder Schreiben von Daten automatisch geringfügig geändert. Diese Änderung der Dateidaten hinter den Kulissen ist für ASCII-Textdateien in Ordnung, beschädigt jedoch Binärdaten wie die in JPEG- oder EXE-Dateien. Achten Sie beim Lesen und Schreiben solcher Dateien sehr darauf, den Binärmodus zu verwenden. Unter Unix tut es nicht weh, ein 'b' an den Modus anzuhängen, sodass Sie es plattformunabhängig für alle Binärdateien verwenden können.

Tamás
quelle
96

Der moderne Weg: benutze newline = ''

Verwenden Sie den newline=Schlüsselwortparameter to io.open () , um LF-End-of-Line-Terminatoren im Unix-Stil zu verwenden:

import io
f = io.open('file.txt', 'w', newline='\n')

Dies funktioniert in Python 2.6+. In Python 3 können Sie stattdessen auch open()den newline=Parameter der integrierten Funktion verwenden io.open().

Der alte Weg: Binärmodus

Die alte Methode zum Verhindern der Zeilenumbruchkonvertierung, die in Python 3 nicht funktioniert, besteht darin, die Datei im Binärmodus zu öffnen , um die Übersetzung von Zeilenendezeichen zu verhindern:

f = open('file.txt', 'wb')    # note the 'b' meaning binary

In Python 3 liest der Binärmodus jedoch Bytes und keine Zeichen, sodass er nicht das tut, was Sie wollen. Sie werden wahrscheinlich Ausnahmen bekommen, wenn Sie versuchen, String-E / A im Stream auszuführen. (zB "TypeError: 'str' unterstützt die Pufferschnittstelle nicht").

Colin D Bennett
quelle
1
Dies hilft mir, indem ich Folgendes verwende: # newline = '' bedeutet nicht konvertieren \ n plus.google.com/+PongsametreySOK/posts/2Bg8AdNJCxV
Osify
Sie können newline auf '\n'direct setzen, dies ist expliziter als ''und ich denke, es ist einfacher, es zu lesen.
12431234123412341234123
1
@ 12431234123412341234123 Ich stimme zu, die Verwendung '\n'ist klarer als ''. Dann brauche ich keinen Kommentar, um zu erklären, was der Code tut :) Aber sei dir bewusst, dass dies nur für das Schreiben von Dateien gilt. Beim Lesen von Dateien newline='\n'ist dies nicht genau das Gleiche wie newline='', da readlines()nur \nim ersteren Fall geteilt wird, aber newline=''damit eine universelle Newline-Behandlung durchgeführt wird, aber dennoch die tatsächlichen Newlines aus der Datei in den Daten zurückgegeben werden. Danke für den Vorschlag! Python-Testprogramm
Colin D Bennett
Python 3.6+ (möglicherweise auch frühere Python3-Versionen). Wenn Sie sich ein wenig Sorgen machen '\n', dass Sie dasselbe sehen , das zuvor umgeschaltet wurde, können Sie den Unicode-Codepunkt verwenden (stellen Sie sicher, dass die Codierung utf-8 oder etwas anderes kompatibles ist). with open('file.txt', 'w', encoding='utf-8', newline='\u000A');; PS Das Ergebnis unterscheidet sich nicht von der newline='\n'Version. Dies ist nur, wenn jemand mehr Komfort wünscht.
bballdave025
9

Sie müssen den binären Pseudomodus verwenden, wenn Sie die Datei öffnen.

f = open('file.txt', 'wb')
Jonathan Feinberg
quelle