0

反復する複数の拡張子を持つファイルのリストを作成しようとしています。スタックオーバーフローに関するほとんどの回答には、ラムダを使用したフィルタリングが含まれていますが、この場合にこれがどのように機能するかはわかりません (反復の設定方法のため)。これまでのところ、

import fnmatch

excluded = ['*.py', '*.py~']

fileNames = []

for fileName in os.listdir('.'):
    fileNames.append(fileName)
    print fileNames

for p in excluded:
    if fnmatch.fnmatch(fileName, p):
        fileNames.remove(fileName)
        print fileNames

明らかに問題は、list.remove が最初のインスタンスのみを削除し、すべてのインスタンスを削除しないことです。この問題を解決する最も効率的な方法は何だと思いますか?

ありがとう!

4

3 に答える 3

4

リスト内包表記を使用します )):

filtered = [x for x in os.listdir('.') if not any(fnmatch.fnmatch(x, p) for p in excluded)]

または、正規表現を使用したよりコンパクトなコード:

filtered = [x for x in os.listdir('.') if not re.search(r'\.py~?$', x)]

または単に使用するendswith

excluded = ('.py', '.py~')
filtered = [x for x in os.listdir('.') if not x.endswith(excluded)]
于 2012-06-01T10:27:37.503 に答える
2

リスト内包表記を使用します:

for p in excluded:
    fileNames = [filename for filename in fileNames if not fnmatch.fnmatch(filename, p)]

any()同様に使用することで、これをさらにうまく行うことができます。

fileNames = [filename for filename in fileNames if not any(fnmatch.fnmatch(filename, p) for p in excluded)]

os.listdir()とにかくリストを返すので、作成しているリストは無意味であることに注意してください。したがってfileNames = os.listdir()、同じ結果を取得するために行うことも、リスト内包表記に配置することもできます。

fileNames = [filename for filename in os.listdir() if not any(fnmatch.fnmatch(filename, p) for p in excluded)]

リストを作成するときに値を編集したい場合は、リスト内包表記を使用して編集することもできます。

別の選択肢は、fnmatchモジュールにfnmatch.filter().

于 2012-06-01T10:25:36.557 に答える
2
def includefilename(fileName):
    for ex in excluded:
        if fnmatch.fnmatch(fileName, ex):
            return False
    return True

fileNames = [fileName for fileName in fileNames if includefilename(fileName)]
于 2012-06-01T10:27:46.693 に答える