我正在使用字典理解来获取键值对的字典,其中键是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表达式的图片文件?
答案 0 :(得分: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)
如果要在嵌套目录结构中创建所有文件的字典,则需要将字典理解移出并集成{{1}而是在dict理解中调用:
os.walk()
我删除了所有source_files = {filename: root
for root, dirs, files in os.walk(rootDir)
for filename in files if f.endswith(extensions)}
行;无论如何,默认值为topdown='true'
(注意:python booleans是topdown=True
和True
,而不是字符串。它恰好起作用,因为False
字符串是'truthy',它被认为是在布尔上下文中为True,因为它是非空的。)
答案 1 :(得分: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
# ...
# ...
符合您的需求?