我想替换隐藏文件的内容,所以我试图以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.这两种模式之间有什么区别,一种模式有“权限被拒绝”,而另一种模式工作正常?
更新:我使用Python2.6.6在Win7x64上,目标文件设置了其隐藏属性。当我尝试关闭隐藏属性时,w
模式成功。但当我打开它时,它又失败了。
Q.为什么隐藏文件的w
模式失败?这是众所周知的行为吗?
以下是详细的区别:
来自python文档-http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-
因此,如果您使用的是
w
模式,那么您实际上是在尝试创建一个文件,而您可能没有这样做的权限。r+
是合适的选择。如果您还不知道
.picasi.ini
存在与否,并且您的windows用户在该目录中具有文件创建权限,并且您希望附加新信息而不是从文件的开头开始(也称为“附加”),则a+
将是适当的选择。文件是否隐藏与此无关。
这就是Win32 API的工作原理。在引擎盖下,Python的} 函数,如果失败,它会将Windows错误代码转换为Python
open
函数正在调用^{IOError
。打开模式对应于
GENERIC_READ|GENERIC_WRITE
的dwAccessMode
和OPEN_EXISTING
的dwCreationDisposition
。w
打开模式对应于GENERIC_WRITE
的dwAccessMode
和CREATE_ALWAYS
的dwCreationDisposition
。如果您仔细阅读
CreateFile
文档中的注释,它会说:因此,如果直接从C代码调用
CreateFile
,解决方案是将FILE_ATTRIBUTE_HIDDEN
添加到dwFlagsAndAttributes
参数(而不是仅仅FILE_ATTRIBUTE_NORMAL
)。但是,由于Python API中没有告诉它传入该标志的选项,您只需使用不同的打开模式或使文件不隐藏来解决它。相关问题 更多 >
编程相关推荐