web-dev-qa-db-ja.com

ファイルオブジェクトのrbモードとr + bモードの違いは何ですか

Pythonでpickleモジュールを使用しており、別のファイルを試していますIOモード:

# works on windows.. "rb"
with open(pickle_f, 'rb') as fhand:
        obj = pickle.load(fhand)

# works on linux.. "r"
with open(pickle_f, 'r') as fhand:
        obj = pickle.load(fhand)

# works on both "r+b"
with open(pickle_f, 'r+b') as fhand:
        obj = pickle.load(fhand)

どこでも「r + b」モードについて読んだことはありませんが、 documentation でそれについて言及していることがわかりました。

Linuxで"rb"モードを使用する場合はEOFErrorを取得し、"r"を使用する場合はWindowsを取得します。 "r+b"モードを試してみましたが、両方で機能しています。

"r+b"モードとは何ですか? 「rb」と「r + b」の違いは何ですか?他の人が機能しないのになぜ機能するのですか?

39
Iamcool

r+は、読み取りおよび書き込みモードに使用されます。 bはバイナリ用です。 r+bモードは、バイナリファイルを読み取りモードまたは書き込みモードで開きます。
続きを読むことができます こちら

61
karthikr

rは読み取り用に開き、r+は読み取り用と書き込み用に開きます。 bはバイナリ用です。

これは documentation で綴られています:

Modeの最も一般的に使用される値は、読み取り用の'r'、書き込み用の'w'(ファイルが既に存在する場合は切り捨て)、および追加用の'a'です(一部のUnixシステムでは、すべての書き込みは、現在のシーク位置に関係なく、ファイルの最後に追加されます)。 modeを省略すると、デフォルトで'r'になります。デフォルトでは、テキストモードを使用します。このモードでは、書き込み時に'\n'文字をプラットフォーム固有の表現に変換し、読み取り時に戻すことができます。したがって、バイナリファイルを開くときは、モード値に'b'を追加して、ファイルをバイナリモードで開く必要があります。これにより、移植性が向上します。 ('b'を追加すると、ドキュメントとして機能するバイナリファイルとテキストファイルを異なる方法で処理しないシステムでも役立ちます。モードのその他の可能な値については、以下を参照してください。

モード'r+''w+'および'a+'は、更新のためにファイルを開きます('w+'はファイルを切り捨てます)。バイナリファイルとテキストファイルを区別するシステムでは、'b'をモードに追加して、ファイルをバイナリモードで開きます。この区別がないシステムでは、'b'を追加しても効果はありません。

19
NPE

私の理解では、r+は読み取りと書き込みの両方で開きます(w+は、コメントで指摘されているように、ファイルを切り捨てます)。 bはバイナリモードで開きます。これは、行区切り記号(少なくともC++では)のようなものをあまり意識していないはずです。

6
Dan Lecocq

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

ソース: ファイルの読み取りと書き込み

2
Chankey Pathak