2014-01-13 79 views
1

有沒有更好的方式來獲取根大小而不是使用os.walk?在Python中獲取%ROOT%大小

import os  

def get_size(start_path='.'): 
    total_size = 0 
    for dirpath, dirnames, filenames in os.walk(start_path): 
     for f in filenames: 
      fp = os.path.join(dirpath, f) 
      total_size += os.path.getsize(fp) 
    return total_size  

print get_size("C:/") 

我想這個代碼(這是我從here了),它工作正常文件夾內,沒有那麼快,但是當我嘗試在根目錄下它的超慢,有時它崩潰[WindowsError: [錯誤123]文件名,目錄名稱或卷標語法不正確]。有沒有一種方法可以像C:\中的左臨界屬性一樣獲取根大小?

編輯: 我調整了一些代碼以避免錯誤。

fp = os.path.join(dirpath, f) 
try: 
    stat = os.stat(fp) 
except OSError: 
    continue 

try: 
    seen[stat.st_ino] 
except KeyError: 
    seen[stat.st_ino] = True 
else: 
    continue 

total_size += stat.st_size 

但它仍然緩慢地獄。計算需要6〜7分鐘。

+0

這有幫助嗎? http://stackoverflow.com/questions/1392413/calculating-a-directory-size-using-python – Vanessa

+0

這是我提供的相同鏈接。 –

+0

我會調查os調用。想到「GetDiskFreeSpaceEx()」 – cmd

回答

2

首先,從here得到pywin32(Python for Windows Extensions)。然後,你可以這樣做:

>>> import win32api 
>>> lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes = win32api.GetDiskFreeSpaceEx('C:\\') 
>>> lpTotalNumberOfBytes 
300061552640 

此值(以字節爲單位)等於279 GB,這是我的機器上的C盤的大小。但是,請注意the documentation中的注意事項(重點在this answer中重點說明),這些可能與您的使用案例相關,也可能不相關。

3

您想要訪問操作系統調用以獲取卷的可用空間。

在Python 3.3及更高版本中,它被稱爲shutil.disk_usage。對於較老版本的Python,在Unix上,人們提出了諸如調用外部工具df等各種東西,但這不適用於Windows。看起來最好的答案是調用win32 API函數GetDiskFreeSpaceEx。看看這個電子郵件:下面出現

https://mail.python.org/pipermail/python-win32/2010-July/010640.html

代碼:

from ctypes import c_ulong, byref, windll 

freeBytesAvailable = c_ulong() 
totalNumberOfBytes = c_ulong() 
totalNumberOfFreeBytes = c_ulong() 

# Ansi version: 
windll.kernel32.GetDiskFreeSpaceExA('c:\\', byref(freeBytesAvailable), 
byref(totalNumberOfBytes), byref(totalNumberOfFreeBytes)) 

您也可以撥打Unicode版本GetDiskFreeSpaceExW如果你有一個Unicode文件名。

2

如果您正在尋找跨平臺解決方案,您可能需要嘗試psutil

他們聲稱支持:

"… Linux, Windows, OSX, FreeBSD and Sun Solaris, both 32-bit and 64-bit architectures, with Python versions from 2.4 to 3.4 by using a single code base."

我只是嘗試這樣在終端窗口在Mac上:

>>> import psutil 
>>> d = psutil.disk_usage('/') 
>>> d.free 
230785544192 

,它給了我正確的信息。
他們的網站和文檔可以找到here