Pythonバイトをファイルに書き込む


143

文字列を返す関数があります。文字列には、キャリッジリターンと新しいラインフィード(0x0D、0x0A)が含まれます。ただし、ファイルに書き込むと、新しい改行のみが含まれます。キャリッジリターンと新しいラインフィードを出力に含める方法はありますか。

msg = function(arg1, arg2, arg3)
f = open('/tmp/output', 'w')
f.write(msg)
f.close()

読んだことがあるfile.__doc__
WIM

回答:


257

バイトを書き込む場合は、ファイルをバイナリモードで開く必要があります。

f = open('/tmp/output', 'wb')

8
OPはWindows以外のプラットフォームを使用しているようなので、これはPy3でのみ機能します。Py2では、を使用する必要がありますio.open
lvc

2
私はこれがpython自体のバグだと思います。Pythonは実行時にデータ型を検出でき、バイナリとテキスト入力の間で検出できるので、Python自体で修正する必要があると思います。 python stdlibのifステートメントで回避できたはずです。同意する場合は賛成投票し、必要な場合は反対票を投じて反対票を投じてください。
フェリペバルデス

2
@FelipeValdesは残念ながら、コンテンツが誤って検出された場合、コンテンツを作成するときに驚きをもたらす可能性があります。さらに厄介なことに、その不正確な検出は、意外で追跡が困難になる特定の奇妙なエッジのケースでのみ発生する可能性があります。代わりに、明示的な動作に依存することで、この質問があることを意味している場合でも、さまざまなシナリオでのIOの動作を確実に保証できます。
リアム・ドーソン

1
バイトファイルにはどのような拡張子がありますか?
チアヨンカン

@FelipeValdesこれは、驚き/驚きを最小限に抑えるという原則に関連しています(en.wikipedia.org/wiki/Principle_of_least_astonishment)。あなたの方法は、より適切な名前になります:open_and_detect_file_type()
henrycjc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.