0

Python 2.7.5 ウィン/マック。

複数のストレージ (約 128Tio) 上のファイル (10000 以上) を検索する最良の方法を見つけようとしています。これらのファイルには特定の拡張子があり、一部のフォルダーは無視できます。

os.listdirこれが、再帰を使用した最初の関数です。

count = 0
def SearchFiles1(path):
    global count
    pathList = os.listdir(path)
    for i in pathList:
        subPath = path+os.path.sep+i
        if os.path.isfile(subPath) == True :
            fileName = os.path.basename(subPath)
            extension = fileName[fileName.rfind("."):]
            if ".ext1" in extension or ".ext2" in extension or ".ext3" in extension:
                count += 1
                #do stuff . . .
        else :
            if os.path.isdir(subPath) == True:
                if not "UselessFolder1" in subPath and not "UselessFolder1" in subPath:
                    SearchFiles1(subPath)

それは動作しますが、私はそれがより良い(より速く適切な)可能性があると思いますか、それとも間違っていますか?

だから私は試しましたos.path.walk

def SearchFiles2(path):
    count = 0
    for dirpath, subdirs, files in os.walk(path):
        for i in dirpath:
            if not "UselessFolder1" in i and not "UselessFolder1" in i:
                for y in files:
                    fileName = os.path.basename(y)
                    extension = fileName[fileName.rfind("."):]
                    if ".ext2" in extension or ".ext2" in extension or ".ext3" in extension:
                        count += 1
                        # do stuff . . .
    return count

「カウント」は間違っていて、かなり遅いです。そして、私はどのように機能するかを本当に理解していないと思いますpath.walk

私の質問は、この研究を最適化するために何ができるでしょうか?

4

2 に答える 2

0

したがって、テストと tdelaney との話し合いの後、次のように両方のソリューションを最適化しました。

import os

count = 0
target_files = set((".ext1", ".ext2", ".ext3")) # etc
useless_dirs = set(("UselessFolder2", "UselessFolder2")) # etc
# it could be target_dirs, just change `in` with `not in` when compared.

def SearchFiles1(path):
    global count
    pathList = os.listdir(path)
    for content in pathList:
        fullPath = os.path.join(path,content)
        if os.path.isfile(fullPath):
            if os.path.splitext(fullPath)[1] in target_files:
                count += 1
                #do stuff with 'fullPath' . . .
        else :
            if os.path.isdir(fullPath):
                if fullPath not in useless_dirs:
                    SearchFiles1(fullPath)

def SearchFiles2(path):
    count = 0
    for dirpath, subdirs, files in os.walk(path):
        for name in set(subdirs) & useless_dirs:
            subdirs.remove(name)
        for filename in [name for name in files if os.path.splitext(name)[1] in target_files]:
            count += 1
            fullPath = os.path.join(dirpath, filename)
            #do stuff with 'fullPath' . . .
    return count

Mac/PC v2.7.5 で正常に動作します

速度については、完全に均一です。

于 2015-11-20T16:23:46.167 に答える