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'))}

.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)

如果您想在嵌套目录结构中创建所有文件的字典,则需要将 dict 理解移出并将os.walk()调用集成到 dict 理解中:

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 False,而不是字符串。它恰好起作用,因为'true'作为字符串是“真实的”,它在布尔上下文中被认为是 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 回答