我想更换一个隐藏的文件的内容,所以我试图在打开它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()
问:什么是之间的区别w
和r+
模式,这样一个有拒绝“权限”,但其他工作正常?
更新:我在使用Python 2.6.6 Win7的X64,和目标文件的隐藏属性。 当我试图关闭隐藏属性, w
模式成功。 但是,当我打开它,它再次失败。
问:为什么w
模式无法隐藏文件? 这是已知的行为呢?
这是在Win32 API是如何工作的。 引擎盖下,Python的open
功能调用CreateFile
函数,如果失败,将其转换Windows错误代码转换为Python IOError
。
在r+
开放模式相当于dwAccessMode
的GENERIC_READ|GENERIC_WRITE
和dwCreationDisposition
的OPEN_EXISTING
。 该w
开放模式相当于dwAccessMode
的GENERIC_WRITE
和dwCreationDisposition
的CREATE_ALWAYS
。
如果你仔细阅读的话CreateFile
文档,它说这个:
如果CREATE_ALWAYS
和FILE_ATTRIBUTE_NORMAL
被指定CreateFile
失败,并将最后一个错误ERROR_ACCESS_DENIED
如果该文件存在,并且具有FILE_ATTRIBUTE_HIDDEN
或FILE_ATTRIBUTE_SYSTEM
属性。 为了避免错误,指定相同的属性现有的文件。
所以,如果你是调用CreateFile
直接从C代码,该解决方案是在添加FILE_ATTRIBUTE_HIDDEN
到dwFlagsAndAttributes
参数(而不是仅仅FILE_ATTRIBUTE_NORMAL
)。 然而,由于有Python的API中没有选项告诉它在传递国旗,你只需要通过使用两种不同的开放模式或使非隐藏文件来解决它。
下面是详细的差异: -
``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