首页 > 解决方案 > Python在Windows中读取目录时出错

问题描述

我正在编写一个 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 库

标签: pythonwindowspermissions

解决方案


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

请参阅:Windows 7 拒绝管理员访问

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

和:

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

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

另请参阅:即使我是管理员也拒绝访问?

解决方法:

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.')

路口:

例如,是Windows 7 中 的C:\Documents and Settings一个连接点。C:\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.islink并且pathlib.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(这超出了我的知识范围):实现一个readlink()函数

另请参阅检查文件是否是 python 中的符号链接


推荐阅读