Python Bytes in Datei schreiben

143

Ich habe eine Funktion, die einen String zurückgibt. Die Zeichenfolge enthält Zeilenumbrüche und neue Zeilenvorschübe (0x0D, 0x0A). Wenn ich jedoch in eine Datei schreibe, enthält sie nur die neuen Zeilenvorschübe. Gibt es eine Möglichkeit, die Ausgabe so zu gestalten, dass sie den Wagenrücklauf und den neuen Zeilenvorschub enthält?

msg = function(arg1, arg2, arg3)
f = open('/tmp/output', 'w')
f.write(msg)
f.close()
Blackninja543
quelle
Lesen Siefile.__doc__
wim

Antworten:

257

Wenn Sie Bytes schreiben möchten, sollten Sie die Datei im Binärmodus öffnen.

f = open('/tmp/output', 'wb')
Ignacio Vazquez-Abrams
quelle
8
Da OP anscheinend eine Nicht-Windows-Plattform verwendet, funktioniert dies nur in Py3. In Py2 müssten Sie verwenden io.open.
lvc
2
Ich denke, dies ist ein Fehler in Python selbst, da Python zur Laufzeit Datentypen erkennen und zwischen Binär- und Texteingabe erkennen kann. Ich denke, es sollte in Python selbst behoben werden. Warum landen Hunderte von Menschen auf dieser Seite, wenn Es hätte durch eine if-Anweisung in der Python-Stdlib vermieden werden können. Wenn Sie zustimmen, stimmen Sie zu, stimmen Sie ab, wenn Sie müssen.
Felipe Valdes
2
@FelipeValdes Leider könnte dies beim Schreiben von Inhalten zu Überraschungen führen, wenn diese jemals falsch erkannt werden. Noch ärgerlicher ist, dass diese falsche Erkennung nur in bestimmten seltsamen Randfällen auftreten kann, die überraschend und schwer aufzuspüren sind. Wenn ich mich stattdessen auf explizites Verhalten stütze, auch wenn dies bedeutet, dass wir diese Frage haben, kann ich sicher sein, wie sich E / A unter verschiedenen Szenarien verhält.
Liam Dawson
1
Welche Erweiterung hätten die Byte-Dateien?
Chia Yongkang
@FelipeValdes bezieht sich auf das Prinzip der geringsten Überraschung / des geringsten Erstaunens ( en.wikipedia.org/wiki/Principle_of_least_astonishment ). Ihre Methode würde open_and_detect_file_type()
passender