Pythonを使用したこのコードで「wb」はどういう意味ですか?


107

コード:

file('pinax/media/a.jpg', 'wb')

また、のopen代わりに使用することを検討する必要がありfileます。filePython 2で廃止され(どのバージョンが見つからなかったか)、py3kで削除されました。(スコットに感謝)詳細についてはこの質問を参照してください。
Luiz Damim、2010

1
使用openの代わりに、filePythonの3を参照してくださいにはPython 2で非推奨と除去し、stackoverflow.com/questions/112970/...
マックスGhenis

2
特に質問の性質を考えると、それがOPの独自のコードであると想定することは実際には公平ではありません。それは明らかに一度に有効でした。
mckenzm

回答:


112

ファイルモード、書き込み、バイナリ。.jpgファイルを書き込んでいるので、問題ありません。

しかし、あなたがそのjpgファイルを読むことになっているなら、あなたは使う必要があります 'rb'

より詳しい情報

Windowsでは、モードに追加された「b」はバイナリモードでファイルを開くため、「rb」、「wb」、「r + b」などのモードもあります。WindowsのPythonでは、テキストファイルとバイナリファイルが区別されます。テキストファイルの行末文字は、データの読み取りまたは書き込み時に自動的にわずかに変更されます。ファイルデータに対するこの舞台裏の変更は、ASCIIテキストファイルでは問題ありませんが、JPEGファイルやEXEファイルのようなバイナリデータは破損します。


4
具体的には、Windowsでは、テキストモードで開かれたファイルに対して、fd.write("foo\n")実際にディスクに書き込みますfoo\r\n(に注意してください\r)。
セルジュバレスタ2014

4
'b'は、Windowsだけでなく、すべてのプラットフォームでバイナリモードでファイルを開くと確信しています。そうしないと、ここにも大きな警告が表示されます。
mckenzm

76

wbファイルがバイナリモードで書き込みのためにオープンされていることを示します。

バイナリモードで書き込む場合、Pythonはファイルに書き込まれるときにデータを変更しません。ただし、テキストモードでは(bがで除外される場合、wまたはでテキストモードを指定する場合wt)、Pythonはデフォルトのテキストエンコーディングに基づいてテキストをエンコードします。さらに、Pythonは行末(\n)をプラットフォーム固有の行末に変換します。これにより、exeまたはpngファイルのようなバイナリファイルが破損します。

したがって、テキストモード(テキスト形式またはCSVなどのテキストベースの形式を使用する場合)を書き込む場合はテキストモードを使用し、画像などの非テキストファイルを書き込む場合はバイナリモードを使用する必要があります。

参照:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open


1
これは時間の経過とともに変化した可能性があります。Python 3.6.8を実行しているUbuntu 18.04では、「バイナリモード」が重要でした。wbオプションで開かれたテキストファイル(CSV形式、最終的にはそれほど重要ではない)に書き込もうとしてエラーが発生しました。w代わりにオプションを使用することで、適切に機能させることができました。
TheDavidJohnson

1
コメント@TheDavidJohnsonをありがとう。Python 2.6に戻ると、ドキュメントによると、このbモードはWindowsにのみ影響を与えるとのことです。これは現在、ドキュメントとバイナリモードから削除されています。「テキストを含まないすべてのファイルに使用する必要があります」。
ダニエルG

1
確かに、@ Daniel!ソリューションを投稿していただきありがとうございます。9年以上経っても、それはまだ役に立ちます。それはどれほど素晴らしいことですか?いずれにせよ、私はまだ私のような他の人のために新しい情報を追加したかったのですが、まだ一緒に来て、これが役立つと思います。乾杯!
TheDavidJohnson

素晴らしい説明。ただし、1つの説明があります「テキストファイルを書き込む場合は、テキストモードを使用する必要がある」ということです。完全を期すために、「Pythonは[バイナリモードで]変更しない」という以前のコメントを参照し、エンコーディングがわからない(または気にしない)場合は、テキストファイルでバイナリモードを使用することを付け加えます。ただし、バイトの読み取りまたは書き込みが必要な場合、またはプラットフォームに関係なく行末を保持する場合。
pcdev

8

これが、ファイルを開いているモードです。"wb"は、ファイルに書き込む(w)ことと、バイナリモード(b)で書き込むことを意味します。

詳細については、ドキュメントをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.