Python在Windows中读取目录时出错

时间:2019-01-04 16:19:23

标签: python windows permissions

我正在编写一个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]有人建议通过使用moviepy来写gif来阻止python的访问,这是一个类似的解决方案/问题,下面我将解释为什么不是这种情况。

不太一样,提供的解决方案不适用于此处。我是管理员,我以管理员身份运行,我没有使用moviepy lib

1 个答案:

答案 0 :(得分:2)

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

请参阅:Windows 7 Access Denied For Administrator

  

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

和:

  

启用UAC后,要访问运行Windows的文件夹   在开始菜单中单击资源管理器,然后右键单击并选择   “以管理员身份运行” [...]
  很遗憾,由于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连接。
os.path.islinkpathlib.Path().is_symlink()不适用于Windows结点:

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

似乎有一个答案在讨论用python的Windows结(这超出了我的理解):implementing a readlink() function

另请参阅Check if file is symlink in python