web-dev-qa-db-de.com

Umgang mit\r\n vs\n Zeilenumbrüchen in Python unter Mac vs Windows

Ich habe ein Python-Skript, das unterschiedliche Ausgaben lieferte, wenn es auf einem Windows-Computer und auf einem Mac ausgeführt wurde. Beim tieferen Graben entdeckte ich, dass dies der Fall war, weil Python beim Einlesen von Zeilenumbrüchen auf dem Mac (von einer Datei) \r\n einliess, während \r in Windows irgendwie verschwindet.

Wenn ich also jeden \n im Skript in \r\n ändere, funktioniert das auf dem Mac einwandfrei. Aber wenn ich das mache, funktioniert es auf dem Windows-PC nicht mehr.

Gibt es eine einfache Möglichkeit, dieses Problem zu beheben?

30
wrongusername

Ich denke, es kann davon abhängen, von was Sie lesen, aber die eingebaute open () - Funktion benötigt einen 'mode' -Parameter. Wenn Sie 'U' für den Modus übergeben, kümmert sich Python um die Zeilenumbrüche plattformweise transparent. Es erfordert, dass Python mit einer universellen Unterstützung für Zeilenumbrüche gebaut wird, aber testen Sie es! 

http://docs.python.org/library/functions.html#open

22
jonesy

Unterschiedliche Plattformen haben unterschiedliche Codes für "neue Zeile". Windows hat\r\n, Unix hat\n, Alte Macs haben\r und ja, es gibt einige Systeme, die\n\r auch haben.

Wenn Sie eine Datei im Textmodus in Python 3 öffnen, werden alle Zeilenumbrüche in '\ n' konvertiert und damit erledigt.

infile = open("filename", 'r')

Der Textmodus ist Standard, wenn Sie also nichts sagen, ist es der Textmodus. Aber es ist immer besser, explizit zu sein:

infile = open("filename", 'rt')

Wenn Sie nicht möchten, dass die Zeilenenden übersetzt werden, öffnen Sie die Datei im Binärmodus:

infile = open("filename", 'rb')

In Python 2 ist das anders. Dort würde diese Konvertierung standardmäßig nur unter Windows erfolgen. Wenn Sie möchten, dass sie auf anderen Plattformen ausgeführt wird, können Sie das universelle Newline-Flag hinzufügen:

infile = open("filename", 'rU')

Sie sagen jedoch, dass Sie sich auf Python 3 befinden, und dort geschieht dies im Textmodus auf all platform. Das Hinzufügen des U-Flag sollte also keinen Unterschied machen.

35
Lennart Regebro

Verwenden Sie in Python 3 das Schlüsselwortargument "newline = '\ n'" in open (), um beim Schreiben von Textdateien ein angegebenes Trennzeichen zu verwenden. Weitere Informationen finden Sie unter:

https://pythonconquerstheuniverse.wordpress.com/2011/05/08/newline-conversion-in-python-3/

http://docs.python.org/3/library/functions.html#open

6
Felix

Unter Windows funktionieren beide gut, wenn ich versuche, eine Datei mit einem der beiden (\ r oder\n) Python zu schreiben, der sie in beiden Fällen als Zeilenumbruch interpretiert. Bei Verwendung von "\ r\n" wird es als doppelter Zeilenumbruch interpretiert. (Python 3 unter Windows)

0
as g

In Python 3 hat die Open()-Methode einen newline -Parameter:

newline steuert, wie der universelle Newlines-Modus funktioniert (er gilt nur für den Textmodus ). Es können keine, '', '\ n', '\ r' und '\ r\n' sein. Es funktioniert als folgt:

Beim Lesen von Eingaben aus dem Stream, wenn Newline Keine ist, universal Der Newlines-Modus ist aktiviert. Zeilen in der Eingabe können mit '\ n', '\ r' oder .__ enden. '\ r\n' und diese werden in '\ n' übersetzt, bevor sie an .__ zurückgegeben werden. der Anrufer. Wenn es '' ist, ist der Universal-Newlines-Modus aktiviert, aber die Zeile Endungen werden unübersetzt an den Anrufer zurückgegeben. Wenn es eine der .__ hat. Bei anderen zulässigen Werten werden Eingabezeilen nur durch das angegebene .__ beendet. string, und das Zeilenende wird unübersetzt an den Anrufer zurückgegeben.

Wenn die Ausgabe in den Stream geschrieben wird, wenn der Zeilenumbruch Keine ist, irgendein '\ n' geschriebene Zeichen werden in die Standardzeile des Systems übersetzt Trennzeichen os.linesep. Wenn der Zeilenumbruch '' oder '\ n' ist, dauert keine Übersetzung Platz. Wenn der Zeilenvorschub einen der anderen zulässigen Werte darstellt, ist '\ n' geschriebene Zeichen werden in die angegebene Zeichenfolge übersetzt.

Die alte Art der Verwendung des U-Modusbezeichners wurde zugunsten dieser neuen Methode verworfen.

Universeller Newline-Modus 'U' (veraltet)

0
jdhao