我正在尝试使用一行for for循环中包含扩展名images
,'.png'
或'.jpg'
的文件填充名为'jpeg'
的列表。我通过使用逻辑or
运算符尝试了这一点,但只导致了一个空列表。
images = [i for i in os.listdir('.') if i[-4:] == ('.png' or '.jpg' or 'jpeg')]
如何查看'.png'
,'.jpg'
或'jpeg'
是文件的最后4个字符,同时将它们全部保存在一行for循环中?
答案 0 :(得分:3)
其他答案建议在此处使用in
,但您可能更喜欢使用str.endswith()
方法:
extensions = '.png', '.jpg', '.jpeg'
images = [i for i in os.listdir('.') if i.endswith(extensions)]
这样做的好处是你不必在.jpeg
上捏造匹配:你可以检查任何长度的扩展名(甚至将列表存储在与其余代码分开的地方),而不必担心关于破坏代码,如果有任何更短或更长的代码。
答案 1 :(得分:2)
使用in
运算符:
images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]
更好的是,不要只检查最后4个字符,而是使用os.path.splitext()
:
images = [i for i in os.listdir('.') if os.path.splitext(i)[1] in ('.png', '.jpg', '.jpeg')]
如果你想知道为什么你的代码不起作用:('.png' or '.jpg' or 'jpeg') == '.png'
因为它是第一个不是假的值。
答案 2 :(得分:2)
正如您所写,python评估('.png' or '.jpg' or 'jpeg')
,并将i[-4:]
与结果进行比较。
你可能想要的是@ThiefMaster建议:in
运算符。
答案 3 :(得分:1)
您可以使用fnmatch
模块来实现此目的。
>>> extensions = ['*.jpg','*.png','*.jpeg']
>>> [file for file in os.listdir(".") for ext in extensions if fnmatch.fnmatch(file,ext)]
['1.png', '2.jpg', '3.jpeg']
答案 4 :(得分:0)
表达式('.png'或'.jpg'或'jpeg')实际上首先被评估为'.png',并且可能没有达到预期的效果。
您可以尝试:
images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]
答案 5 :(得分:0)
使用or
是一个布尔表达式,用于检查表达式中的任何值是否计算为True
。
i[-4:] == ('.png' or '.jpg' or 'jpeg')
评估i[-4:]
是否等于:
('.png' or '.jpg' or 'jpeg')
检查每个值是否为True
并返回第一个True
值或最后一个值(如果没有True
值。在这种情况下,它们都评估为True
,因为只有空字符串计算为False
,因此'.png'
是表达式的结果。
您可以通过执行
来解决此问题[i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]
或者更好的方式
[i for i in os.listdir('.') if os.path.splitext(i)[1] in ('.png','.jpg','.jpeg')]