次のコードを検討してください。
try:
f = open("myfile2.dat", "rb")
except IOError:
f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()
このコードを実行したときに myfile2.dat が存在しない場合、Idle は ab+ ではなく rb+ で新しいファイルを開きます。なぜですか?
次のコードを検討してください。
try:
f = open("myfile2.dat", "rb")
except IOError:
f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()
このコードを実行したときに myfile2.dat が存在しない場合、Idle は ab+ ではなく rb+ で新しいファイルを開きます。なぜですか?
追加 + 書き込みモードで新しいファイルを開いています。に追加するファイルがないため、代わりに読み取り + 書き込みモードでファイルを取得します。
これは本質的に同じことです。ここでは問題ありません。ファイルの読み取りと書き込みの両方を行うことができます。
内部的には、ファイルはまだ追加モードで開かれていますが、この.mode
属性により、ファイルがよりシンプルに表示されます。ファイルを開いたときに何が起こったかではなく、ファイルで今できることを報告するだけです。ファイルの読み取りまたは書き込みが可能で、ファイルが排他的な作成 (x
モード) で開かれた場合にのみ表示されます。
属性のC コードを.mode
参照してください。
更新:はい、これは紛らわしく、実際にはバグです。この不一致を修正するためのパスは最近 Python にマージされ、Python 2.7、3.3、および 3.4 の新しいリリースが出てくると、ファイル オブジェクトの.mode
属性は、ファイルを開くために使用された元のモード文字列をより適切に反映するようになります。
編集:これは無視してください。これは Python 2.x で行われました。元の質問には #python-3.x タグがありませんでした。
それは私のためにab +を開きました:
>>> try:
... f = open("myfile2.dat", "rb")
... except IOError:
... f = open("myfile2.dat", "ab+")
...
>>> print(f.mode)
ab+
これは Mac で Jython を実行しています。