使用 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)]
大致遵循 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)]