折叠列出png文件

2024-03-28 11:57:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在包含其他文件夹的文件夹中列出所有png文件。这是我的密码。

import os
filelist=os.listdir('images')
for fichier in filelist:
    if not(fichier.endswith(".png")):
        filelist.remove(fichier)
print(filelist)

问题是,最后一次打印显示一些子文件夹(但不是全部)逃过了筛选。。。

['aa.png', 'Nouveau dossier - Copie', 'Nouveau dossier - Copie (3)', 'Nouveau dossier - Copie (5)', 'zz.png']

我做错什么了?


Tags: 文件inimport文件夹密码forpngos
2条回答

小结:永远,永远,永远修改正在迭代的列表。

相反,在副本上迭代:

import os
filelist=os.listdir('images')
for fichier in filelist[:]: # filelist[:] makes a copy of filelist.
    if not(fichier.endswith(".png")):
        filelist.remove(fichier)
print(filelist)

或者,如果您不想进行不必要的复制,请反向迭代(这只有在您能够保证列表中的项是唯一的时才有效;对于文件系统,这是一个很好的假设):

for fichier in reversed(filelist):
    # do stuff

请注意,您可以使用Python的glob模块来简化:

import glob
print(glob.glob('images/*.png'))

为什么

在Python中遍历列表时,Python实际上是在后台遍历列表的索引。你可以看到这是一个巨大的问题,每当你真正删除的项目:

l = [1, 2, 2, 3]:
for x in l:
    if x%2 == 0:
        l.remove(x)
    print('x == {}'.format(x))
print('l == {}'.format(l))

从这里打印的内容可以看出跳过了第二个2,并且l的值为[1, 2, 3]。这是因为,只要到达并移除前2个,索引就是1(第二个元素)。在下一次迭代中,索引是2。此时,l == [1,2,3],所以x == 3。如果运行代码,可能比这个解释更明显。

在遍历列表时不应修改列表。它会导致有趣的事情发生。

最好使用列表理解:

filelist= [file for file in os.listdir('images') if file.endswith('.png')]

相关问题 更多 >