我正在编写一个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
答案 0 :(得分:2)
在Windows中,管理员无法立即访问所有内容。
更加复杂。
请参阅:Windows 7 Access Denied For Administrator:
最简单的方法是关闭UAC。 文件夹访问将与XP完全一样
和:
启用UAC后,要访问运行Windows的文件夹 在开始菜单中单击资源管理器,然后右键单击并选择 “以管理员身份运行” [...]
很遗憾,由于Windows资源管理器中的错误,此操作无法正常运行
(但是我建议检查一种解决方法是否足够好,如果不确定,请确保您完全了解自己在做什么。)
另请参阅:Access denied even though I'm an Administrator?
您可以捕获错误:
(当然,通过这种方式,您只会接受没有访问权限)
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 ) )
您可以使用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中的junction至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连接。
os.path.islink
和pathlib.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