2012-05-07 131 views
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 

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

+0

我不确定为什么会添加额外的\。但是你有没有试过用“/”来代替?对于大多数图书馆和语言来说,它通常更适合路径。 – TheSHEEEP

+0

是的,返回完全一样的东西。究竟。 – mirandalol

+0

听起来像Windows Vista/7和权限问题,因为你试图访问你的userdir之外的文件... – mensi

回答

4

关于你的第一个问题

why does it backslash the backslashes?

这仅仅是一个显示的问题。由于\是转义字符,因此您可以输入字符串\作为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" 

为一个字符串与正确转义\秒。


你的第二个问题,然而,

and how can I fix the error?

是有点棘手。

我认为你有多次递归的问题:一方面,walk()完全遍历树。所以从第二级开始,join(path,file)是错的,你应该用root代替path。另一方面,您可以递归地调用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子目录,该目录不在本身。将它与正确的目录结合起来可以找到它。

+0

没有解决问题。也;我在尝试使用SOF之前试过,在发布之前我总是研究我的问题:) – mirandalol

+0

哪个问题?你想知道为什么有'\'对,我回答了这个问题。我错过了什么? – glglgl

+0

对不起,我不清楚,我想知道如何消除\\所以它可以完成os.stat(path).st_size函数。 – mirandalol