我正在尝试获取目录大小的函数。
def fsize(path, returntype='b'):
size = 0
if isdir(path):
for root, dirs, files in walk(path):
for file in files:
size += getsize(join(path,file))
else:
print abspath(path)
size = getsize(abspath(path))
if returntype != 'b':
return convert_size(size, returntype)
return size
path = r"D:\Library\Daniel's_Books"
print fsize(path, 'm')
我得到了这个有趣的错误:
size = getsize(abspath(path))
File "C:\Python27\lib\genericpath.py", line 49, in getsize
return os.stat(filename).st_size
WindowsError: [Error 2] The system cannot find the file specified: "D:\\Library\\Daniel's_Books\\cover.jpg"
D:\Library\Daniel's_Books\cover.jpg
为什么反斜杠反斜杠? 以及如何修复错误?
答案 0 :(得分:4)
关于你的第一个问题
为什么反斜杠反斜杠?
这只是一个显示问题。由于\
是转义字符,因此您可以将\
s内的字符串设为r'\'
或'\\'
。确切地说,它也会以这种方式显示,换句话说:就像它被the repr()
function重新调整一样。
BTW:你的
path = "D:\Library\Daniel's_Books"
由于相同的原因而存在问题:它只能起作用,因为\D
和\L
没有有效的转义。你最好把它写成
path = r"D:\Library\Daniel's_Books"
作为原始字符串或
path = "D:\\Library\\Daniel's_Books"
作为正确转义\
s。
然而,你的第二个问题
以及如何修复错误?
有点棘手。
我认为你有多次递归的问题:一方面,walk()
完全穿过树。因此,从第二级开始,join(path,file)
是错误的,您应该将path
替换为root
。另一方面,您递归调用fsize()
,这可能会导致文件重复。
假设您有以下树:
.
+- A
| +- a
| +- b
+- B
| +- a
| +- b
+- a
+- b
os.walk()
遍历给定的树,为每个目录级别生成root, dirs, files
。
在这个例子中,它将产生
'.', ['A', 'B'], ['a', 'b']
'.\\A', [], ['a', 'b']
'.\\B', [], ['a', 'b']
因此root
包含files
所在的当前处理目录。
我认为您的cover.jpg
位于Daniel's_Books
的子目录中,而不是此目录本身。将它与正确的目录结合起来就可以找到它。