隠しファイルの内容を置き換えたいので、それを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+
モードの違いは何ですか。一方は「許可が拒否されました」が、もう一方は正常に動作しますか。
PDATE: win7 x64でPython 2.6.6を使用しており、ターゲットファイルに隠し属性が設定されています。隠し属性をオフにしようとすると、w
モードは成功しますが、再びオンにすると、再び失敗します。
Q。隠しファイルでw
モードが失敗するのはなぜですか?これは既知の動作ですか?
Win32 APIの仕組みです。内部では、Pythonのopen
関数は CreateFile
関数を呼び出しており、それが失敗した場合、WindowsエラーコードをPython IOError
。
r+
オープンモードは、GENERIC_READ|GENERIC_WRITE
のdwAccessMode
およびOPEN_EXISTING
のdwCreationDisposition
に対応します。 w
オープンモードは、GENERIC_WRITE
のdwAccessMode
およびCREATE_ALWAYS
のdwCreationDisposition
に対応します。
CreateFile
ドキュメントの注意を注意深く読むと、次のように書かれています。
CREATE_ALWAYS
およびFILE_ATTRIBUTE_NORMAL
が指定されている場合、CreateFile
は失敗し、ファイルが存在し、ERROR_ACCESS_DENIED
またはFILE_ATTRIBUTE_HIDDEN
属性を持つ場合、最後のエラーをFILE_ATTRIBUTE_SYSTEM
に設定します。エラーを回避するには、既存のファイルと同じ属性を指定します。
したがって、CコードからCreateFile
を直接呼び出している場合、解決策はFILE_ATTRIBUTE_HIDDEN
をdwFlagsAndAttributes
パラメーターに追加することです(単なるFILE_ATTRIBUTE_NORMAL
ではなく)。ただし、Python APIにはそのフラグを渡すように指示するオプションがないため、別のオープンモードを使用するか、ファイルを非隠された。
詳細な違いは次のとおりです。
`` r ''テキストファイルを読み取り用に開きます。ストリームはファイルの先頭に配置されます。
`` r + ''読み取りおよび書き込み用に開きます。ストリームはファイルの先頭に配置されます。
`` w ''ファイルを長さゼロに切り捨てるか、書き込み用のテキストファイルを作成します。ストリームはファイルの先頭に配置されます。
`` w + ''読み取りおよび書き込み用に開きます。ファイルが存在しない場合は作成され、存在しない場合は切り捨てられます。ストリームはファイルの先頭に配置されます。
「a」書き込み用に開きます。ファイルが存在しない場合は作成されます。ストリームはファイルの末尾に配置されます。後続のファイルへの書き込みは、介在するfseek(3)などに関係なく、常に現在のファイルの終わりで終了します。
`` a + ''読み取りおよび書き込み用に開きます。ファイルが存在しない場合は作成されます。ストリームはファイルの末尾に配置されます。後続のファイルへの書き込みは、介在するfseek(3)などに関係なく、常に現在のファイルの終わりになります。
From python documentation- http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-
Windowsでは、モードに「b」を追加すると、ファイルがバイナリモードで開かれるため、「rb」、「wb」、「r + b」などのモードもあります。 Pythonは、テキストファイルとバイナリファイルを区別します。テキストファイルの行末文字は、データの読み取りまたは書き込み時に自動的にわずかに変更されます。 ASCIIテキストファイルのファイルデータは問題ありませんが、JPEGまたはEXEファイルのようなバイナリデータは破損します。このようなファイルの読み取りと書き込みを行うときは、バイナリモードを使用してください。モードに「b」を追加しても問題はないため、すべてのバイナリファイルに対してプラットフォームに依存せずに使用できます。
したがって、w
モードを使用している場合、実際にはファイルを作成しようとしているため、そのためのアクセス許可がない可能性があります。 r+
が適切な選択です。
.picasi.ini
が存在するかどうかにかかわらず、Windowsユーザーはそのディレクトリにファイル作成権限を持ち、ファイルの先頭から開始する代わりに新しい情報を追加する(別名「追加」)後、a+
が適切な選択です。
ファイルが隠されているかどうかとは関係ありません。