路径突然被反击

时间:2012-05-07 10:53:27

标签: python windows file path size

我正在尝试获取目录大小的函数。

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

为什么反斜杠反斜杠? 以及如何修复错误?

1 个答案:

答案 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的子目录中,而不是此目录本身。将它与正确的目录结合起来就可以找到它。