Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查python中文件的权限_Python_Python 2.7_Error Handling_File Permissions - Fatal编程技术网

检查python中文件的权限

检查python中文件的权限,python,python-2.7,error-handling,file-permissions,Python,Python 2.7,Error Handling,File Permissions,我试图检查给定指定路径的文件的可读性。以下是我所拥有的: def read_permissions(filepath): '''Checks the read permissions of the specified file''' try: os.access(filepath, os.R_OK) # Find the permissions using os.access except IOError: return False

我试图检查给定指定路径的文件的可读性。以下是我所拥有的:

def read_permissions(filepath):
    '''Checks the read permissions of the specified file'''
    try:
        os.access(filepath, os.R_OK) # Find the permissions using os.access
    except IOError:
        return False

    return True
这将起作用,并在运行时返回True或False作为输出。但是,我希望来自
errno
的错误消息伴随它。这是我认为我必须要做的(但我知道有点不对劲):

但是,如果我输入一个不存在的文件,它会告诉我该文件存在。有人能帮我解释一下我做错了什么(以及我将来能做些什么来避免这个问题)?我还没有看到有人使用
os.access
尝试过这个。我还可以选择其他选项来测试文件的权限。有人能帮助我在出现问题时如何发出适当的错误消息吗

此外,这可能适用于我的其他功能(它们在检查其他内容时仍然使用
os.access
,例如使用
os.F_OK
检查文件是否存在,以及使用
os.W_OK
检查文件的写入权限)。下面是我试图模拟的一个例子:

>>> read_permissions("located-in-restricted-directory.txt") # Because of a permission error (perhaps due to the directory)
[errno 13] Permission Denied
>>> read_permissions("does-not-exist.txt") # File does not exist
[errno 2] No such file or directory
这正是我试图通过向问题返回适当的错误消息来模拟的事情。我希望这将有助于避免对我的问题产生任何混淆


我可能应该指出,虽然我已经阅读了
os.access
文档,但我并不打算稍后打开该文件。我只是尝试创建一个模块,其中一些组件用于检查特定文件的权限。我有一个基线(我提到的第一段代码),它是我代码其余部分的决策者。在这里,我只是想用一种用户友好的方式(不仅仅是
True
False
,而是完整的消息)再次编写它。由于
IOError
可以通过两种不同的方式出现(例如权限被拒绝,或者目录不存在),因此我试图让我的模块识别并发布该问题。我希望这能帮助您帮助我确定任何可能的解决方案。

os.access
在文件不存在时返回
False
,而不管传递的模式参数如何

这并没有在中明确说明,但这并不是非常令人震惊的行为;毕竟,如果一个文件不存在,你就不可能访问它。按照文档的建议进行检查提供了另一个线索,即
access
在各种条件下返回
-1
。在任何情况下,您都可以像我一样简单地在IDLE中检查返回值:

>>> import os
>>> os.access('does_not_exist.txt', os.R_OK)
False
在Python中,通常不鼓励在尝试真正做有用的事情之前先检查类型之类的东西。这种哲学通常用缩写EAFP来表达,EAFP表示请求原谅比允许更容易。如果您再次参考文档,您会发现这在本例中特别相关:

注意:使用
access()
检查用户是否有权打开文件,例如,在实际操作之前使用
open()
创建安全性 洞,因为用户可能会利用 检查并打开文件以对其进行操作。最好使用 技术。例如:

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

try:
    fp = open("myfile")
except IOError as e:
    if e.errno == errno.EACCES:
        return "some default data"
    # Not a permission error.
    raise
else:
    with fp:
        return fp.read()
如果除了在调用
open()
之前对用户进行二次猜测之外,您还有其他检查权限的原因,那么您可以寻求一些建议。请记住,如果您确实需要引发异常,您可以自己
引发它;没有必要去野外打猎


因为IOError可以通过两种不同的方式(例如 权限被拒绝,或目录不存在),我正在尝试获取 用于识别和发布问题的模块

这就是上面第二种方法的作用。见:

>>> try:
...     open('file_no_existy.gif')
... except IOError as e:
...     pass
...
>>> e.args
(2, 'No such file or directory')
>>> try:
...     open('unreadable.txt')
... except IOError as e:
...     pass
...
>>> e.args
(13, 'Permission denied')
>>> e.args == (e.errno, e.strerror)
True
但你需要选择一种或另一种方法。如果你在请求原谅,那么就用try-except块来做(打开文件),并适当地处理后果。如果你成功了,那么你知道你成功了,因为没有例外

另一方面,如果你以这样或那样的方式请求许可(又名LBYL,三思而后行),你仍然不知道你是否能成功打开文件,直到你真正打开它。如果文件在您检查其权限后被移动,该怎么办?如果有你认为不需要检查的问题呢


如果您仍要请求许可,请不要使用try-except;你没有做这件事,所以你不会出错。相反,使用条件语句调用
os.access
作为条件。

块之后的
else
块中尝试使用
打印(“文件存在”)
。这就是你想要的行为吗?试着用
return
而不是
print
。我刚刚试过(意思是AirThomas的建议)。它给了我同样的输出,说文件存在,而实际上它不存在。我将
打印(“文件存在”)
放在
else
块中,在
除外的
块之后。另外,mc10,我只是用
print
代替
return
,它似乎也没有什么作用。在上一个例子中,使用
IOError
可能会重复、、等,这一点非常广泛。您也可以分别捕获
FileNotFoundError
PermissionError
>>> try:
...     open('file_no_existy.gif')
... except IOError as e:
...     pass
...
>>> e.args
(2, 'No such file or directory')
>>> try:
...     open('unreadable.txt')
... except IOError as e:
...     pass
...
>>> e.args
(13, 'Permission denied')
>>> e.args == (e.errno, e.strerror)
True