2013-02-15 44 views
2

如何在計算python跨平臺中的所有文件時快速計算大目錄的大小,這是我當前的代碼,但是這是非常緩慢的大文件編號(100000):使用python(跨平臺)快速計算目錄和子目錄中的所有文件

class filecounter: 
    def count(self, scandir): 
      global filescount 
      global totalsize 
      if not scandir[-1] == '/' or '\\': 
        scandir = scandir + '/' 
      try: 
        for item in os.listdir(scandir): 
          if os.path.isdir(scandir + item): 
            filecounter().count(scandir + item) 
          else: 
            totalsize = totalsize + os.path.getsize(scandir +item) 
            filescount = filescount + 1 
      except WindowsError, IOError: 
        pass 

全球需要

+1

爲什麼不使用'os.walk()'來代替? – 2013-02-15 21:05:53

+1

'如果不是scandir [-1] =='/'或'\\''不符合你的想法。試試'如果scandir [-1]不在('/','\\')'中。 – 2013-02-15 21:08:03

+0

P.S.如果你正確編碼了這個全局變量,那麼這個全局變量是不需要的 - 讓函數以元組或列表的形式返回這兩個值。 – 2013-02-15 21:09:38

回答

3

documentation for os.walk幾乎精確樣品你所要求的:

# from http://docs.python.org/2/library/os.html 
import os 
from os.path import join, getsize 
for root, dirs, files in os.walk('python/Lib/email'): 
    print root, "consumes", 
    print sum(getsize(join(root, name)) for name in files), 
    print "bytes in", len(files), "non-directory files" 
    if 'CVS' in dirs: 
     dirs.remove('CVS') # don't visit CVS directories 

改變它來滿足您的需求是相當簡單:

import os 
from os.path import join, getsize 
size = 0 
count = 0 
for root, dirs, files in os.walk('.'): 
    size += sum(getsize(join(root, name)) for name in files) 
    count += len(files) 
print count, size 
+0

謝謝,正是我需要的。 – user1469729 2013-02-15 21:28:22

2

如果你想要寫文件導航移植的代碼,你應該考慮使用功能和常量從os模塊(os.path.joinos.pathsepos.altsep。 ..)。

您可以優化代碼的一種方法是通過使用os.walk函數來刪除遞歸和全局變量,但它不會爲您帶來太多收穫。你將受到計算機I/O速度的限制。

def count(directory): 
    totalsize = 0 
    filecount = 0 
    for dirpath, dirnames, filenames in os.walk(directory): 
     for filename in filenames: 
      try: 
       totalsize += os.path.getsize(os.path.join(dirpath, filename)) 
       filecount += 1 
      except OSError: 
       pass 
    return totalsize, filecount 

大部分的時間將被用在系統調用來得到一個目錄下的文件列表,並獲得一個特定的文件的大小。您可能可能使用python線程來並行調用os.stat(間接由os.path.getsize調用)。一次,python線程會在系統調用時釋放GIL。

相關問題