python - 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 库
解决方案
在 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()函数
推荐阅读
- javascript - Angular 7 Guard 重定向仅适用于双击
- angular - 特殊字符不应该允许在反应形式中的第一个字符 - Angular 7
- python - Project Euler #25 - 性能可以进一步提高吗?
- javascript - 如何从 localhost php 文件中的“$.post”获取数据?
- javascript - 将函数作为参数传递给函数
- c# - 初始化基类中的所有派生成员变量是不是一个坏主意?
- html - 相对容器位置错误
- kubernetes - How to access external SMTP server from within Kubernetes cluster with Istio Service Mesh
- excel - 如果单元格包含特定文本,则删除 Outlook 约会
- java - TimeZone.getTimeZone("PST") 与 TimeZone.getTimeZone("America/Los_Angeles")