2

如何在计算 python 跨平台中的所有文件的同时快速计算大目录的大小,这是我当前的代码,但在大文件数(超过 100000)上非常慢:

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

需要全局

4

2 回答 2

3

文档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
于 2013-02-15T21:16:13.833 回答
2

如果你想为文件导航编写可移植的代码,你应该考虑使用os模块中的函数和常量(os.path.join, os.pathsep, os.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 时工作。

于 2013-02-15T21:18:09.713 回答