1

我正在尝试images使用具有扩展名的文件'.png''.jpg''jpeg'单行 for 循环中填充一个名为的列表。我通过使用逻辑or运算符进行了尝试,但这只会导致一个空列表。

images = [i for i in os.listdir('.') if i[-4:] == ('.png' or '.jpg' or 'jpeg')]

如何检查文件的最后 4 个字符是否'.png''.jpg'是否'jpeg'是文件的最后 4 个字符,同时将其全部保存在一行 for 循环中?

4

6 回答 6

3

其他答案已建议in在此处使用,但您可能更喜欢的另一种方法是使用该str.endswith()方法:

extensions = '.png', '.jpg', '.jpeg'
images = [i for i in os.listdir('.') if i.endswith(extensions)]

这样做的好处是您不必在匹配项上捏造.jpeg:您可以检查任何长度的扩展名(甚至将列表存储在与其余代码分开的地方),而不必担心如果有更短的代码会破坏代码或比其他人更长。

于 2012-04-22T12:45:39.723 回答
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'因为它是第一个不虚假的值。

于 2012-04-22T12:16:40.373 回答
2

在您编写它时,python 评估('.png' or '.jpg' or 'jpeg')并与i[-4:]结果进行比较。

您可能想要的是@ThiefMaster 建议的:in操作员。

于 2012-04-22T12:20:03.477 回答
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']
于 2012-04-22T12:24:41.650 回答
0

表达式('.png' 或 '.jpg' 或 'jpeg')实际上首先被评估为 '.png',并且可能不会像您预期的那样表现。

您可以尝试:

images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]
于 2012-04-22T12:20:36.690 回答
0

Usingor是一个布尔表达式,它检查表达式中的任何值是否为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')]
于 2012-04-22T12:33:45.797 回答