0

私は辞書理解を使用して、キーと値のペアの辞書を取得しています。ここで、キーはmp3ファイルの名前であり、値はファイルへのパスです。

そうです:

for root, dirs, files in os.walk(rootDir, topdown='true'):
    source_files = {filename:root for filename in files if os.path.splitext(filename)[1].lower() == '.mp3'}
    # more code
    # ...
    # ...

パーツ内のソースファイルを使用して、より多くのロジックを実行しますmore code。ここで、このロジックを任意の画像(.gif、.jpegなど)に対して繰り返します。

だから私はすることができました:

for root, dirs, files in os.walk(rootDir, topdown='true'):
    source_files = {filename:root for filename in files if os.path.splitext(filename)[1].lower() == '.jpeg' or os.path.splitext(filename)[1].lower() == '.gif'}

more code次に、パーツを関数にラップして、画像ファイルに対して呼び出します。しかし、辞書の理解でif式を動的にしてから、音楽ファイルのif式と画像ファイルのif式を渡すだけでよいのでしょうか。

4

2 に答える 2

4

fnmatch.fnmatch代わりに関数を探していると思います。fnmatch.filter()

from fnmatch import filter

for root, dirs, files in os.walk(rootDir):
    source_files = {filename: root for filename in filter(files, '*.jpg')}

ただし、複数の拡張子を一致させる必要がある場合は、使用する方がはるかに簡単ですstr.endswith():

for root, dirs, files in os.walk(rootDir):
    source_files = {filename: root for filename in files if filename.endswith(('.jpg', '.png', '.gif'))}

you を使用.endswith()すると、拡張子の任意の文字列またはタプルを使用できます。

mp3s = '.mp3'
images = ('.jpg', '.png', '.gif')

次に使用します:

extensions = images

for root, dirs, files in os.walk(rootDir):
    source_files = {filename: root for filename in files if filename.endswith(extensions)}

ここで口述内包表記を使用している理由がわかりません。ループの各反復はroot一定になります。あなたもそうするかもしれません:

for root, dirs, files in os.walk(rootDir):
    source_files = dict.fromkeys(filter(files, '*.jpg'), root)

または使用

for root, dirs, files in os.walk(rootDir):
    source_files = dict.fromkeys([f for f in files if f.endswith(extensions)], root)

ネストされたディレクトリ構造内のすべてのファイルの辞書を作成する場合は、辞書内包表記を移動しos.walk()、代わりに辞書内包表記に呼び出しを統合する必要があります。

source_files = {filename: root 
    for root, dirs, files in os.walk(rootDir)
    for filename in files if f.endswith(extensions)}

topdown='true'すべての行を削除しました。デフォルトはtopdown=Trueとにかくです(注:pythonブール値は文字列ではなくTrueandです。文字列は「真実」であるため、空ではないためブールコンテキストでTrueと見なされるFalseため、たまたま機能しました)。'true'

于 2013-02-20T11:46:54.730 に答える
0

これを行います:

def a_func(extension):
    # some code
    for root, dirs, files in os.walk(rootDir, topdown='true'):
        source_files = {filename:root for filename in files if os.path.splitext(filename)[1].lower() == extension}
        # more code
        # ...
        # ...

あなたのニーズに合いますか?

于 2013-02-20T11:48:17.580 に答える