我试图写一个程序,本质上划分不同的文件类型在不同的目录。我的计算机确实有许多不同的图像文件类型,所以在我的代码中有很长的一行:
if file.name.endswith(".jpg") or
file.name.endswith(".JPG") or
file.name.endswith(".jpeg") or
file.name.endswith(".JPEG") or
file.name.endswith(".heic") or
file.name.endswith(".HEIC") or
file.name.endswith(".png") or
file.name.endswith(".PNG") or
file.name.endswith(".avif") or
file.name.endswith(".AVIF"):
我尝试将所有文件类型字符串放入列表并使用any()
函数,但问题是any()给出布尔输出,而file.name.endswith()
函数需要str输入。
对于如何简化这一行有什么想法吗?
根据您对file.name
的使用,我猜file
可能是一个路径对象。如果是这样,除了name
属性之外,它还有一个包含文件扩展名的suffix
(和stem
,它是文件名在扩展名之前的一部分,可以用于其他事情)。一旦有了后缀,就可以将其小写并检查其在集合中的隶属关系(这比在列表中检查隶属关系更有效)。
if file.suffix.lower() in {'.jpg', '.jpeg', '.heic', '.png', '.avif'}:
os.path.splitext()
可以将扩展名从文件名中分离出来,使用lower()
可以避免单独处理不同大小写的变体:
valid_extensions = set(['.jpg', '.jpeg', '.heic', '.png', '.avif'])
def check_extension(filename):
return os.path.splitext(filename)[1].lower() in valid_extensions
>>> check_extension('good.JPEG')
True
>>> check_extension('bad.zip')
False
str.endswith()
接受一个字符串元组,任何匹配的都是True
。同时使用str.lower()
,这样你就不需要分别检查大小写了。
if file.name.lower().endswith((".jpg", ".jpeg", ".heic", ".png", ".avif")):