【问题标题】:Both os.path.isfile(fullpath) and os.path.isdir(fullpath) return false ! Why?os.path.isfile(fullpath) 和 os.path.isdir(fullpath) 都返回 false !为什么?
【发布时间】:2017-08-02 01:25:33
【问题描述】:

遍历下面提到的目录和所有子目录(Windows 8.1)以打印所有文件及其完整路径会返回错误(无效目录)。 在 python 解释器中进行测试时,我得到以下输出:

os.path.isfile("C:\\Miele_Service\\Miele Offline-ETD\\DATA_data.mdf")

给予:

False

还有:

os.path.isdir("C:\\Miele_Service\\Miele Offline-ETD\\DATA_data.mdf")

给予:

False

在我看来,权限存在问题,因为 *.mdf 是一个 sql 数据库文件。

我需要做什么才能通过代码获得必要的权限才能确认它确实是一个文件并将其打印出来?


编辑:

在命令提示符下使用 icacls 函数检查结果:

对于被拒绝访问的文件所在的目录:

> icacls "C:\Miele_Service\Miele Offline-ETD"
C:\Miele_Service\Miele Offline-ETD 

    Everyone:(OI)(CI)(F)
    BUILTIN\Administrators:(I)(OI)(CI)(F)
    NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
    BUILTIN\Users:(I)(OI)(CI)(RX)
    NT AUTHORITY\Authenticated Users:(I)(M)
    NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M)

Successfully processed 1 files; Failed processing 0 files

对于我得到拒绝访问错误的文件(我必须使用与开篇文章不同的文件,因为我手动更改了原始文件的权限以确认它是读取访问权限问题):

> icacls "C:\Miele_Service\Miele Offline-ETD\DATA_log.ldf"
C:\Miele_Service\Miele Offline-ETD\DATA_log.ldf: Access is denied.
Successfully processed 0 files; Failed processing 1 files

我应该使用什么模块在 Python 中自动修改文件和目录的权限?

编辑 2:

检查提升的命令提示符:

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Windows\system32>icacls "C:\Miele_Service\Miele Offline-ETD"
C:\Miele_Service\Miele Offline-ETD 

    Everyone:(OI)(CI)(F)
    BUILTIN\Administrators:(I)(OI)(CI)(F)
    NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
    BUILTIN\Users:(I)(OI)(CI)(RX)
    NT AUTHORITY\Authenticated Users:(I)(M)
    NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M)

Successfully processed 1 files; Failed processing 0 files

C:\Windows\system32>icacls "C:\Miele_Service\Miele Offline-ETD\DATA_log.ldf"
C:\Miele_Service\Miele Offline-ETD\DATA_log.ldf 

    TKlucziowski\SQLServerMSSQLUser$TKlucziowski$MIELE_ETD:(F)
    OWNER RIGHTS:(F)
    BUILTIN\Administrators:(F)

Successfully processed 1 files; Failed processing 0 files

似乎拥有管理员权限的 icacls 能够成功访问该文件...

所以请指点我一个在 Python 中启用权限更改的模块。我是新手,但我知道最好的方法是暂时取消限制(并以某种方式备份它?)并在访问文件后恢复以前的权限。

谢谢。

【问题讨论】:

  • 它在尝试打开它时返回访问被拒绝......
  • 它在尝试打开它时返回拒绝访问....刚刚更改了它的所有者,我现在可以访问它,所以文件存在,但 python 仍然返回无效目录。 os.listdir(path) 函数是否对名称中包含空格字符的目录有问题?
  • 我在windows中访问文件没有问题,windows读取目录没有任何问题...
  • 好的,刚刚确认。我必须更改管理员和所有者的权限才能获得对文件的完全访问权限(仅在为管理员更改后仍然显示访问被拒绝。之后 python 函数 isfile 返回 True 但现在同一目录中的其他一些文件有类似的启用保护并导致相同的问题(无效的目录。假设我有一个目录充满了像这样受保护的文件,我不想在 Windows 中手动编辑所有文件权限,请问哪个模块在 python 中启用了该功能?
  • 该文件已经设置了明确的权限(而不是继承的权限),可能是由数据库软件设置的,可能是有原因的。更改权限然后再次更改它们不是一个好的解决方案。您的程序不应该与另一个程序的文件混淆。无论如何它都行不通;如果您没有运行提升权限,您将无权更改权限,如果您正在运行提升权限,则您将不会需要更改权限。要么以某种方式列出父目录的内容,要么以提升的权限运行程序。

标签: python windows file-permissions


【解决方案1】:

您的路径错误,Python 找不到您的文件。

在路径中的空格前添加\ 以将其转义。

无论如何,这不应该是权限问题。

【讨论】:

  • 您在 OP 的代码中究竟在哪里看到了一个 ``?
  • 他似乎编辑了他的问题,代码与我最初看到的不同。
  • 格式不正确,显然 SO 文本编辑器在非代码文本块中需要双 `\`。
【解决方案2】:

试试

os.path.isdir("C:\\Miele_Service\\Miele\ Offline-ETD\\DATA_data.mdf")

你的目录名称中有一个空格字符

大多数解释器将空格字符视为结束,因此,在所考虑的情况下,os.path.isdir 会查找C:\Miele_Service\Miele dir 而不是C:\Miele_Service\Miele Offline-ETD,找不到它,返回False\ 用于在名称/路径中包含空格字符(视为符号,无特殊含义)

【讨论】:

  • 空格字符在此字符串文字中没有特殊含义;不需要逃避;这只是在不属于的字符串中插入一个反斜杠字符。您似乎对如何在 shell 中使用路径感到困惑,其中空格是参数分隔符,而路径是 Python 脚本中的字符串文字。
  • 目录名中有一个实际的空格:os.path.isfile("C:\\Miele_Service\\Miele Offline-ETD\\DATA_data.mdf") 刚查了一下,就在那里。文件前的目录名称为“Miele Offline-ETD”。它包含一个空格。没有丢失 \\.
  • 好吧,和空间无关。刚检查。空格在路径中没有特殊含义,可以包含在目录名中。所有的子目录都用 \\ 分割,所以这里没有问题。问题是检查 isfile 和 isdir 都返回 False ,然后我的程序尝试将该路径用作目录(但它是一个文件)并失败。为什么两次检查都返回 False ???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多