这段代码有什么问题让它错过从列表中删除最后一个html文件?

时间:2015-06-10 08:18:13

标签: python python-2.7

在mint上使用Python 2.7。尝试从目录中的文件列表中删除所有HTML或XML文件。当文件名是所有数字时,它只会删除四个非图像文件中的3个......并且在最终打印中,仍然会在列表中留下00335786.html。

pdfImages = os.listdir(pdfLocalPath + "/html/")
    for item in pdfImages:##FIX TODO
        print "ITEM = " + item
        if str(item).endswith(("xml", "html")):
            print "FOUND FILE = " + item
            pdfImages.remove(item)

    print "pdfImages = " + str(pdfImages)

使用此文件列表

['00335786_ind.html', '00335786.html', '00335786-3_1.png', '00335786-1_1.png', '00335786.xml', '00335786-5_1.png', '00335786-2_1.png', '00335786s.html', '00335786-4_1.png']

我得到了这个回报

['00335786.html', '00335786-3_1.png', '00335786-1_1.png', '00335786-5_1.png', '00335786-2_1.png', '00335786-4_1.png']

我尝试过另一个文件,在其自己的目录中

['p6004-53_2.png', 'p6004-141_2.png', 'p6004-96_1.jpg', 'p6004-178_2.jpg', 'p6004-133_4.jpg', 'p6004-96_2.jpg', 'p6004-211_1.jpg', 'p6004-220_1.jpg', 'p6004-142_1.png', 'p6004-135_4.jpg', 'p6004-189_1.jpg', 'p6004-192_1.jpg', 'p6004-225_1.jpg', 'p6004-146_1.jpg', 'p6004-150_1.jpg', 'p6004-133_1.jpg', 'p6004-54_2.jpg', 'p6004-227_1.jpg', 'p6004-39_1.jpg', 'p6004-149_1.jpg', 'p6004-161_1.jpg', 'p6004-154_1.jpg', 'p6004-217_1.jpg', 'p6004-219_1.jpg', 'p6004-54_1.png', 'p6004-17_1.jpg', 'p6004-174_1.jpg', 'p6004-1_1.jpg', 'p6004-142_2.png', 'p6004-214_2.jpg', 'p6004-51_2.png', 'p6004-243_5.png', 'p6004-208_1.jpg', 'p6004-55_1.jpg', 'p6004-197_1.jpg', 'p6004-170_2.jpg', 'p6004-214_1.jpg', 'p6004-46_1.jpg', 'p6004-60_2.png', 'p6004-23_1.jpg', 'p6004-138_1.jpg', 'p6004-218_2.jpg', 'p6004-97_3.png', 'p6004-198_1.jpg', 'p6004-199_1.jpg', 'p6004-209_1.jpg', 'p6004-183_1.jpg', 'p6004-94_2.jpg', 'p6004-172_1.jpg', 'p6004-159_1.jpg', 'p6004-163_1.jpg', 'p6004-243_6.png', 'p6004-53_1.png', 'p6004-203_1.jpg', 'p6004-243_2.png', 'p6004-57_1.png', 'p6004-176_1.jpg', 'p6004-188_1.jpg', 'p6004-192_2.jpg', 'p6004-21_2.jpg', 'p6004-49_1.png', 'p6004-102_1.jpg', 'p6004-156_1.png', 'p6004-95_1.jpg', 'p6004-21_1.jpg', 'p6004-167_1.jpg', 'p6004.xml', 'p6004-133_2.jpg', 'p6004-145_1.jpg', 'p6004-26_2.jpg', 'p6004-134_1.jpg', 'p6004-135_2.jpg', 'p6004-169_1.jpg', 'p6004-138_3.jpg', 'p6004-3_1.jpg', 'p6004-194_1.jpg', 'p6004-141_3.jpg', 'p6004-135_1.jpg', 'p6004-138_2.jpg', 'p6004-155_1.jpg', 'p6004-140_1.jpg', 'p6004-91_1.jpg', 'p6004-156_3.jpg', 'p6004s.html', 'p6004-135_3.jpg', 'p6004-243_3.png', 'p6004.html', 'p6004-136_2.jpg', 'p6004_ind.html', 'p6004-218_1.jpg', 'p6004-191_1.jpg', 'p6004-200_1.jpg', 'p6004-173_1.jpg', 'p6004-94_1.jpg', 'p6004-152_1.jpg', 'p6004-222_2.jpg', 'p6004-178_1.jpg', 'p6004-229_1.jpg', 'p6004-242_3.png', 'p6004-20_1.jpg', 'p6004-170_1.jpg', 'p6004-168_1.jpg', 'p6004-26_1.jpg', 'p6004-222_1.jpg', 'p6004-225_2.jpg', 'p6004-243_1.png', 'p6004-97_2.png', 'p6004-210_2.jpg', 'p6004-49_2.png', 'p6004-215_1.jpg', 'p6004-221_1.jpg', 'p6004-25_1.jpg', 'p6004-242_1.png', 'p6004-133_6.jpg', 'p6004-171_1.jpg', 'p6004-57_2.png', 'p6004-156_2.png', 'p6004-204_1.jpg', 'p6004-243_4.png', 'p6004-220_2.jpg', 'p6004-139_1.jpg', 'p6004-210_1.jpg', 'p6004-242_2.png', 'p6004-205_1.jpg', 'p6004-160_1.jpg', 'p6004-60_1.png', 'p6004-147_1.jpg', 'p6004-48_1.jpg', 'p6004-97_1.jpg', 'p6004-133_3.jpg', 'p6004-133_7.jpg', 'p6004-52_1.jpg', 'p6004-98_1.jpg', 'p6004-273_1.png', 'p6004-211_2.jpg', 'p6004-155_2.jpg', 'p6004-200_2.jpg', 'p6004-99_1.jpg', 'p6004-179_1.jpg', 'p6004-141_4.png', 'p6004-226_1.jpg', 'p6004-133_5.jpg', 'p6004-154_2.jpg', 'p6004-181_1.jpg', 'p6004-61_1.jpg', 'p6004-175_1.jpg', 'p6004-165_1.jpg', 'p6004-141_1.png', 'p6004-51_1.png', 'p6004-136_1.jpg']

并成功删除所有.html和.xml文件。我认为它可能是一个int vs str的东西,但没有成功...... ???

3 个答案:

答案 0 :(得分:3)

那是因为你正在迭代一个列表,并在迭代时删除项目,所以你将跳过一些项目。

如果要删除符合特定条件的项目,请使用filter

>>> list(filter(lambda x: not str(x).endswith(("xml","html")), pdfImages))
['00335786-3_1.png', '00335786-1_1.png', '00335786-5_1.png', '00335786-2_1.png', '00335786-4_1.png']

答案 1 :(得分:0)

使用列表推导可以达到相同的效果。

尝试以下方法:

pdfImages = ['00335786_ind.html', '00335786.html', '00335786-3_1.png', '00335786-1_1.png', '00335786.xml', '00335786-5_1.png', '00335786-2_1.png', '00335786s.html', '00335786-4_1.png']
replaced_items = [img for img in pdfImages if not img.endswith(('xml', 'html'))]
print(replaced_items)

您将获得以下内容:

['00335786-3_1.png', '00335786-1_1.png', '00335786-5_1.png', '00335786-2_1.png', '00335786-4_1.png']

答案 2 :(得分:0)

问题在于您循环遍历列表并同时删除其元素,因此当前项索引不指向所需的元素。

以下作品 -

import os
pdfImages = os.listdir("temp")

pdfImages = [item for item in pdfImages if not str(item).endswith(("xml", "html"))]

print "pdfImages = " + str(pdfImages)