为什么文件是可写的但是os.access(file,os.W_OK)返回false?

时间:2014-09-18 09:17:41

标签: python file operating-system

我不太确定这里发生了什么。基于对python的解释

> os.W_OK:     值包含在access()的mode参数中以测试路径的可写性。

我想这个检查应该返回True,即使文件不存在,但它的路径是有效的,我有权写这个文件。

但是当我尝试检查文件路径是否可写时会发生这种情况。

import os, subprocess
pwd = os.getcwd();
temp_file_to_write = os.path.join( pwd, "temp_file" );
# use os.access to check 
say = "";
if ( os.access( temp_file_to_write, os.W_OK ) ) :
    say = "writeable";
else :
    say = "NOT writeable";

print "L10", temp_file_to_write, "is", say
# use try/except
try :
    with open( temp_file_to_write, "w" ) as F :
        F.write( "L14 I am a temp file which is said " + say + "\n" );
    print "L15", temp_file_to_write, "is written";
    print subprocess.check_output( ['cat', temp_file_to_write ] );
except Exception, e:
    print "L18", temp_file_to_write, "is NOT writeable";

它产生以下结果

L10 /home/rex/python_code/sandbox/temp_file is NOT writeable
L15 /home/rex/python_code/sandbox/temp_file is written
L14 I am a temp file which is said NOT writeable

有谁知道为什么?如果我对os.W_OK的理解是错误的,你能告诉我在python中检查以下两个方面的正确方法吗1)文件路径是否有效; 2)我是否有权写作。

3 个答案:

答案 0 :(得分:1)

是否可以创建新文件取决于目录具有的权限,而不是新的不存在的(尚未)文件。

创建文件后(存在),如果您可以修改其内容access(W_OK)可能会返回true。

答案 1 :(得分:0)

也许你用sudo运行你的脚本(或者在Windows上运行这样的东西)? 我在linux上有这个(我给了chmod 400):

>>> os.access(fn, os.W_OK)
False
>>> f = open(fn, 'w')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 13] Permission denied: '/tmp/non-writable'

答案 2 :(得分:0)

原始问题要求如何检查写文件的权限。但是,在Python中,最好使用try-except块尝试写入文件,而不是在可能的情况下测试访问权限。原因在Python.org网站上的os.access()文档中给出:https://docs.python.org/3/library/os.html

从网站上:

注意:使用access()检查用户是否被授权访问例如在打开文件之前 实际上,使用open()这样做会产生安全漏洞,因为用户可能会利用检查和打开文件之间的较短时间间隔来对其进行操作。最好使用EAFP技术。例如:

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
return "some default data"

最好写成:

try:
    fp = open("myfile")
except PermissionError:
    return "some default data"
else:
    with fp:
        return fp.read()

注意:即使access()指示I / O操作将成功,但I / O操作可能也会失败,尤其是对于网络文件系统上的操作,其权限语义可能超出常规的POSIX权限位模型。