28

w隠しファイルの内容を置き換えたいので、消去/切り捨てられるようにモードで開こうとしました:

>>> import os
>>> ini_path = '.picasa.ini'
>>> os.path.exists(ini_path)
True
>>> os.access(ini_path, os.W_OK)
True
>>> ini_handle = open(ini_path, 'w')

しかし、これによりトレースバックが発生しました。

IOError: [Errno 13] Permission denied: '.picasa.ini'

r+ただし、次のモードで意図した結果を達成できました。

>>> ini_handle = open(ini_path, 'r+')
>>> ini_handle.truncate()
>>> ini_handle.write(ini_new)
>>> ini_handle.close()

Q.wとモードの違いは何ですか。r+一方は「許可が拒否されました」が、もう一方は正常に動作しますか?

更新:私は Python 2.6.6 を使用して win7 x64 を使用しており、ターゲット ファイルには隠し属性が設定されています。隠し属性をオフにしてみたらwモード成功。しかし、再びオンにすると、再び失敗します。

Q.w隠しファイルでモードが失敗するのはなぜですか? これは既知の動作ですか?

4

3 に答える 3

38

これがWin32APIの仕組みです。内部的には、Pythonのopen関数が関数を呼び出しておりCreateFile、それが失敗した場合は、WindowsのエラーコードをPythonに変換しますIOError

r+オープンモードは、のとdwAccessModeに対応GENERIC_READ|GENERIC_WRITEdwCreationDispositionますOPEN_EXISTINGwオープンモードは、のとdwAccessModeに対応GENERIC_WRITEdwCreationDispositionますCREATE_ALWAYS

CreateFileドキュメントの注釈を注意深く読むと、次のようになります。

CREATE_ALWAYSおよびFILE_ATTRIBUTE_NORMALが指定されている場合、CreateFile失敗し、最後のエラーをERROR_ACCESS_DENIEDファイルが存在し、FILE_ATTRIBUTE_HIDDENまたはFILE_ATTRIBUTE_SYSTEM属性を持っている場合に設定します。エラーを回避するには、既存のファイルと同じ属性を指定します。

したがってCreateFile、Cコードから直接呼び出す場合、解決策は(だけでなく)パラメーターに追加FILE_ATTRIBUTE_HIDDENすることです。ただし、Python APIにはそのフラグを渡すように指示するオプションがないため、別のオープンモードを使用するか、ファイルを非表示にしないことで回避する必要があります。dwFlagsAndAttributesFILE_ATTRIBUTE_NORMAL

于 2012-11-04T04:11:03.947 に答える
4

詳細な違いは次のとおりです。

``r'' 読み取り用にテキスト ファイルを開きます。ストリームはファイルの先頭に配置されます。

``r+'' 読み書き用にオープン。ストリームはファイルの先頭に配置されます。

``w'' ファイルの長さを 0 に切り詰めるか、書き込み用のテキスト ファイルを作成します。ストリームはファイルの先頭に配置されます。

``w+'' 読み書き用に開きます。ファイルが存在しない場合は作成され、存在しない場合は切り捨てられます。ストリームはファイルの先頭に配置されます。

``a'' 書き込み用に開きます。ファイルが存在しない場合は作成されます。ストリームはファイルの最後に配置されます。ファイルへの後続の書き込みは、介在する fseek(3) などに関係なく、常にその時点でのファイルの終わりで終了します。

``a+'' 読み書き用にオープン。ファイルが存在しない場合は作成されます。ストリームはファイルの最後に配置されます。ファイルへの後続の書き込みは、介在する fseek(3) などに関係なく、常にその時点でのファイルの終わりで終了します。

Python ドキュメントから - http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-

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

モードを使用しているw場合は、実際にファイルを作成しようとしていて、それを行う権限がない可能性があります。r+が適切な選択です。

自分がどこに存在するかまだわからない状況にあり.picasi.ini、Windows ユーザーがそのディレクトリでファイル作成権限を持っていて、ファイルの先頭から開始する代わりに新しい情報を追加したい場合 (別名「追加」) 、a+適切な選択になります。

ファイルが非表示かどうかとは関係ありません。

于 2012-11-04T03:14:33.177 に答える