0

我正在尝试获取获取目录大小的功能。

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

为什么它反斜杠反斜杠?我该如何解决这个错误?

4

1 回答 1

4

关于你的第一个问题

为什么它反斜杠反斜杠?

这只是一个展示的问题。与\转义字符一样,您可以在 as或 as中给出带有\s 的字符串。也正是以这种方式显示,换句话说:函数返回的完全一样。r'\''\\'repr()

顺便说一句:你的

path = "D:\Library\Daniel's_Books"

由于同样的原因,它是有问题的:它只起作用,因为\D并且\L没有有效的转义。你最好把它写成

path = r"D:\Library\Daniel's_Books"

作为原始字符串或

path = "D:\\Library\\Daniel's_Books"

作为带有正确转义\的字符串。


然而,你的第二个问题,

我该如何解决这个错误?

有点棘手。

我认为你有多重递归的问题:一方面,walk()完全遍历树。所以从第 2 级开始,join(path,file)是错误的,你应该pathroot. 另一方面,您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,而不是在此目录本身中。将其与正确的目录结合将使其被发现。

于 2012-05-07T11:05:41.000 回答