Это как работает Win32 API. Под капотом функция open
Python вызывает функцию CreateFile
, и если это не удается, она преобразует код ошибки Windows в Python IOError
.
r+
открытый режим соответствует dwAccessMode
в GENERIC_READ|GENERIC_WRITE
и dwCreationDisposition
в OPEN_EXISTING
. Режим открытия w
соответствует dwAccessMode
в GENERIC_WRITE
и dwCreationDisposition
в CREATE_ALWAYS
.
Если вы внимательно прочитали замечания в документации CreateFile
, в нем говорится следующее:
Если заданы
blockquote>CREATE_ALWAYS
иFILE_ATTRIBUTE_NORMAL
,CreateFile
завершается с ошибкой и устанавливает последнюю ошибку наERROR_ACCESS_DENIED
, если файл существует и имеет атрибутFILE_ATTRIBUTE_HIDDEN
илиFILE_ATTRIBUTE_SYSTEM
. Чтобы избежать ошибки, укажите те же атрибуты, что и существующий файл.Итак, если вы вызывали
CreateFile
непосредственно из C-кода, решением было бы добавитьFILE_ATTRIBUTE_HIDDEN
кdwFlagsAndAttributes
(вместоFILE_ATTRIBUTE_NORMAL
). Однако, поскольку в API-интерфейсе Python нет возможности сказать, что он пройдет в этом флаге, вам просто придется обойти его, либо используя другой открытый режим, либо сделав файл не скрытым.