2012-05-07 119 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