IO错误:[错误13]许可,尝试打开“W”模式隐藏的文件时被拒绝(IOError: [Errno 1

2019-06-18 19:50发布

我想更换一个隐藏的文件的内容,所以我试图在打开它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()

问:什么是之间的区别wr+模式,这样一个有拒绝“权限”,但其他工作正常?

更新:我在使用Python 2.6.6 Win7的X64,和目标文件的隐藏属性。 当我试图关闭隐藏属性, w模式成功。 但是,当我打开它,它再次失败。

问:为什么w模式无法隐藏文件? 这是已知的行为呢?

Answer 1:

这是在Win32 API是如何工作的。 引擎盖下,Python的open功能调用CreateFile函数,如果失败,将其转换Windows错误代码转换为Python IOError

r+开放模式相当于dwAccessModeGENERIC_READ|GENERIC_WRITEdwCreationDispositionOPEN_EXISTING 。 该w开放模式相当于dwAccessModeGENERIC_WRITEdwCreationDispositionCREATE_ALWAYS

如果你仔细阅读的话CreateFile文档,它说这个:

如果CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL被指定CreateFile失败,并将最后一个错误ERROR_ACCESS_DENIED如果该文件存在,并且具有FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEM属性。 为了避免错误,指定相同的属性现有的文件。

所以,如果你是调用CreateFile直接从C代码,该解决方案是在添加FILE_ATTRIBUTE_HIDDENdwFlagsAndAttributes参数(而不是仅仅FILE_ATTRIBUTE_NORMAL )。 然而,由于有Python的API中没有选项告诉它在传递国旗,你只需要通过使用两种不同的开放模式或使非隐藏文件来解决它。



Answer 2:

下面是详细的差异: -

``R“”的阅读打开文本文件。 流被定位在文件的开头。

``R +“”打开阅读和写作。 流被定位在文件的开头。

``W“”截断文件长度为零或写入创建文本文件。 流被定位在文件的开头。

``W +“”打开阅读和写作。 如果不存在,该文件被创建,否则将被截断。 流被定位在文件的开头。

``一个'开放的写作。 如果不存在,该文件被创建。 流被定位在文件的结尾。 后续写入到该文件将总是在文件的当前然后结束结束,不论任何居间FSEEK(3)或类似的。

``A +“”打开阅读和写作。 如果不存在,该文件被创建。 流被定位在文件的结尾。 Subse- quent写入文件将始终在文件的当前然后结束结束,不论任何居间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+将是合适的选择。

它无关,与你的文件是否被隐藏。



文章来源: IOError: [Errno 13] Permission denied when trying to open hidden file in “w” mode