【问题标题】:Python getting errors reading directory in WindowsPython在Windows中读取目录时出错
【发布时间】:2019-05-31 05:48:54
【问题描述】:

我正在编写一个 python 脚本来提供我的目录和子目录的大小。我收到以下错误。

=======================
        AMD
                Bytes: 23917297664
                Megs: 22809.3125
                Gigs: 22.27471923828125
Traceback (most recent call last):
  File "c:\users\user\desktop\temp3.py", line 13, in <module>
    sum(os.path.getsize(f) for f in os.listdir(dir) if os.path.isfile(f))
PermissionError: [WinError 5] Access is denied: 'Documents and Settings

这是我的代码

import os


dir_size = sum(os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f))
print(os.getcwd())
print(os.listdir('.'))
print("\tBytes: {}".format(dir_size))
print("\tMegs: {}".format(dir_size/1048576))
print("\tGigs: {}".format((dir_size/1048576)/1024))

dirs = os.listdir('.')

for dir in dirs:
    if "$" not in dir:
        sum(os.path.getsize(f) for f in os.listdir(dir) if os.path.isfile(f))
        print("=======================")
        print("\t{}".format(dir))
        print("\t\tBytes: {}".format(dir_size))
        print("\t\tMegs: {}".format(dir_size/1048576))
        print("\t\tGigs: {}".format((dir_size/1048576)/1024))

我是系统上唯一的用户,我是管理员,所以我认为我当然应该有权查看所有内容。有什么想法吗?

附带说明: PermissionError: [WinError 5] Access is denied python using moviepy to write gif 已被建议作为类似的解决方案/问题,下面我解释为什么不是这种情况。

不一样,这里提供的解决方案并不适用。我是管理员,我以管理员身份运行它,我没有使用 moviepy 库

【问题讨论】:

  • 谢谢,我在发这个帖子的时候看过了。不一样,这里提供的解决方案并不适用。我是管理员,我以管理员身份运行它,我没有使用 moviepy 库,但谢谢。
  • 你是如何运行它的?通过空闲?
  • 我在 Windows 10 中通过命令行运行。
  • 不确定,但不是 os.listdir(dir) 尝试:os.listdir(os.path.join(dirs,dir))

标签: python windows permissions


【解决方案1】:

在 Windows 中,管理员无法立即访问所有内容。
比较复杂。

见:Windows 7 Access Denied For Administrator

最简单的 [方法] 是关闭 UAC。 文件夹访问将与 XP 完全一样

和:

启用 UAC 后,要访问需要运行 Windows 的文件夹 Explorer [...] 从开始菜单,右键单击它并选择 “以管理员身份运行”[...]
很遗憾,由于 Windows 资源管理器中的错误,这不起作用

(但我建议检查解决方法是否足够好,如果不确定您是否完全了解自己在做什么。)

另见:Access denied even though I'm an Administrator?

解决方法:

1)

你可以发现错误:
(当然,这样你就只能接受无权访问)

import os

def getList( dir ):
    try:
        return os.listdir( dir )
    except Exception as e:
        print('!ERROR: {}, {}'.format( type(e).__name__, dir ) )
    return []

root = 'c:/'
for dir in getList( root ):
    dir = root + '/' + dir
    if os.path.isdir( dir ):
        dir_size = sum( os.path.getsize( dir + '/' + f ) for f in getList( dir ) if os.path.isfile( dir + '/' + f ) )
        print( "{}, {}".format( dir_size, dir ) )

2)

你可以使用os.walk():

os.walk() 可以正常工作,但是:

  • 始终遍历所有级别的所有文件/文件夹。
  • 根本不显示C:\Documents and Settings
    我不确定是什么标准对此负责。显然没有显示“权限被拒绝”文件夹(?)(显示了自己的连接点和隐藏文件。)

您可以忽略关卡(但无论如何都会在后台遍历所有关卡):

import os

path = 'C:'
startlevel = path.count( os.sep )
level = 0
w = os.walk( path )

for p, dn, fn in w:
    level = p.count( os.sep )
    if level - startlevel < 1:
        print( level, p )

print('done.')

路口:

例如C:\Documents and Settings 在 Windows 7 中是 junctionC:\Users

您无法访问C:\Documents and Settings
但是您可以访问C:\Documents and Settings\yourUserName = c:/Users/yourUserName

d = os.listdir('c:/Documents and Settings')               # -> ERROR
d = os.listdir('c:/Documents and Settings/yourUserName')  # -> OK

os.listdir('c:/Documents and Settings/yourUserName') == os.listdir('c:/Users/yourUserName') # -> True

没有简单的方法在 Python 2 和 3 中检查 windows junctions。
os.path.islinkpathlib.Path().is_symlink() 不适用于 windows junctions:

os.path.islink('C:/Documents and Settings')              # returns False
pathlib.Path('C:/Documents and Settings').is_symlink()   # returns False

有一个答案似乎讨论了 python 中的 windows junctions(超出了我的知识范围):implementing a readlink() function

另见Check if file is symlink in python

【讨论】:

  • 连接点用于挂载点。当它们以卷 GUID 名称为目标时(如 mountvol.exe 所做的那样),它们类似于 Unix 挂载。当它们以本地路径为目标时(如 CMD 的 mklink /j),它们类似于 Unix 绑定挂载。 "\Documents and Settings" 是与 "\Users" 的绑定样式联结,其存在是为了向后兼容。这个路口的安全性剥夺了每个人列出其内容的权利,因为它的存在只是为了被遍历。由于目录的安全性,这严格来说是一个访问问题;否则,在这方面,路口没有什么特别之处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2021-01-23
  • 2022-01-23
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多