我想知道是否可以替换它:
results = [x for x in os.listdir(dir_path) if os.path.splitext(x)[1] == ".tif" and "abc" in os.path.splitext(x)[0]]
有类似的东西:
results = [x for x in os.listdir(dir_path) if ext == ".tif" and "abc" in name for ext, name in os.path.splitext(x)]
感谢您的帮助
答案 0 :(得分:3)
你的线很长,你可能想把它分成多行。你可以将你的条件包裹在一个函数中:
def filter_file(path):
ext, name = os.path.splitext(path)
if not ext == '.tif':
return False
return 'abc' in name
然后使用
results = [x for x in os.listdir(dir_path) if filter_file(x)]
答案 1 :(得分:1)
您可以使用内部生成器表达式定义name
和ext
:
results = [x for x, name, ext in ((x, *os.path.splitext(x)) for x in os.listdir(dir_path))
if ext == ".tif" and "abc" in name]
在这里,*os.path.splitext(x)
将该调用的结果解包为外部列表解析中的name
和ext
变量(仅在Python 3中)。对于旧版本,您可以使用(x,) + os.path.splitext(x)
代替。另请注意,splitext
将返回元组(name, ext)
,而不是(ext, name)
。
或者,不要使用splitext
,只需直接检查文件名,假设您要在名称部分中找到的部分不能出现在文件名的扩展部分。
results = [x for x in os.listdir(dir_path) if x.endswith(".tif") and "abc" in x]
答案 2 :(得分:1)
我猜这是你想要的:
results = [name + ext for name, ext in [os.path.splitext(x) for x in os.listdir(dir_path)] if ext == ".tif" and "abc" in name ]
注意:我已将name
放在ext
之前。
内部列表生成一个元组列表,即名称和ext值。