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.pathsepos.altsep

コードを最適化する1つの方法は、関数を使用して再帰とグローバル変数を削除する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

ほとんどの時間は、ディレクトリ内のファイルのリストを取得し、特定のファイルのサイズを取得するためにsyscallに費やされます。おそらく、Pythonスレッドを使用してos.stat(によって間接的に呼び出されるos.path.getsize)の呼び出しを並列化できます。かつては、Pythonスレッドは、システムコールを実行するときにGILを解放するときに機能していました。

于 2013-02-15T21:18:09.713 に答える