使用 if 条件列表理解以获取特定类型的文件列表

List comprehension with if conditional to get list of files of a specific type

大致遵循 this solution 中描述的将列表理解与 if-else 放在一起的逻辑,我试图获取父目录下具有特定扩展名的文件列表。

这是代码的完整形式:

mxd_list = []
for top_dir, dir_list, obj_list in os.walk(top_path):
    for obj in obj_list:
        if obj.endswith('.mxd'):
            mxd_list.append(os.path.join(top_dir, obj))

这是我目前尝试使用列表理解来巩固这一点。虽然它运行了,但列表是空的。

for top_dir, dir_list, obj_list in os.walk(top_path):
    mxd_list = [os.path.join(top_dir, obj) for obj in obj_list if obj.endswith('.mxd')]

你离得很近。您需要附加到循环外的列表

mxd_list = []
for top_dir, dir_list, obj_list in os.walk(top_path):
    mxd_list.extend([os.path.join(top_dir, obj) for obj in obj_list if obj.endswith('.mxd')])

错误是 - 在外部 for 循环的每次迭代中,列表 comp 只会生成一个特定于该迭代的列表,因此您需要 extend 每次迭代后生成的每个列表以外部变量,mxd_list.

注意 - [ 是多余的,因为删除它们会使内容成为生成器表达式。即语句可以写成mxd_list.extend(os.path.join(top_dir, obj) for obj in obj_list if obj.endswith('.mxd'))

另一种方法 - 使用glob.iglob

mxd_list = []
for top_dir, dir_list, obj_list in os.walk(top_path):
     mxd_list.extend(iglob(top_dir+"/*.mxd"))

是一种更好的方法。但不要忘记 import 模块,即 from glob import iglob

匹配文件的路径名列表可以通过单个列表推导来计算

[os.path.join(d,f) for d,_,fl in os.walk(top) for f in fl if f.endswith(ext)]