1

次のコードを検討してください。

try:
    f = open("myfile2.dat", "rb")
except IOError:
    f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()

このコードを実行したときに myfile2.dat が存在しない場合、Idle は ab+ ではなく rb+ で新しいファイルを開きます。なぜですか?

4

2 に答える 2

4

追加 + 書き込みモードで新しいファイルを開いています。に追加するファイルがないため、代わりに読み取り + 書き込みモードでファイルを取得します。

これは本質的に同じことです。ここでは問題ありません。ファイルの読み取り書き込みの両方を行うことができます。

内部的には、ファイルはまだ追加モードで開かれていますが、この.mode属性により、ファイルがよりシンプルに表示されます。ファイルを開いたときに何が起こったかではなく、ファイルでできることを報告するだけです。ファイルの読み取りまたは書き込みが可能で、ファイルが排他的な作成 (xモード) で開かれた場合にのみ表示されます。

属性のC コードを.mode参照してください。

更新:はい、これは紛らわしく、実際にはバグです。この不一致を修正するためのパスは最近 Python にマージされ、Python 2.7、3.3、および 3.4 の新しいリリースが出てくると、ファイル オブジェクトの.mode属性は、ファイルを開くために使用された元のモード文字列をより適切に反映するようになります。

于 2013-03-21T22:28:10.727 に答える
0

編集:これは無視してください。これは 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 を実行しています。

于 2013-03-21T22:29:14.507 に答える