意外行为,从列表中删除项目

问题描述 投票:0回答:1

对于初学者来说,我是python和编码的新手。

我正在尝试从正在创建的zip文件夹中删除desktop.ini文件。我正在使用以下方法来执行此操作

if 'desktop.ini' in item:
     contents.remove(item)
     continue

但是,desktop.ini之后列表中的项目也被删除,我不知道为什么。任何想法为什么会这样?

这里是整个脚本,需要更多上下文

import shutil
import zipfile
import tempfile
from distutils.dir_util import copy_tree

def fileList(fileName):
    files = list()
    for (dirpath, dirnames, filenames) in os.walk(fileName):
        files += [os.path.join(dirpath, file) for file in filenames]
    return files

print("What version are these macros? ")
versNo = str(input())
path = os.path.dirname(os.path.realpath(__file__))
mac = 'macros'

with tempfile.TemporaryDirectory() as macfolder:
    copy_tree(os.path.join(path,mac),macfolder)
    with zipfile.ZipFile(os.path.join(path, "Release Assets",'Nautilus_Macros_'+versNo+'.zip'),'a') as maczip:
        contents = fileList(macfolder)
        #print(contents)
        for item in contents:
            #print(item)
            if 'desktop.ini' in item:
                    contents.remove(item)
                    continue
            #print(item)
            f = open(item,'r+')
            lines = f.readlines()
            f.seek(0)
            f.write('; Macro for the Nautilus 3D printer by Hydra Research \n')
            f.write('; Version: '+versNo+' \n \n')
            for line in lines:
                f.write(line)
            f.close()
            print(item)
            maczip.write(os.path.join(macfolder, item), os.path.relpath(item, macfolder))
    maczip.close()
python
1个回答
0
投票

在遍历列表(或其他集合)时,从列表(或其他集合)中删除某物时,警笛声应响起,警告灯应闪烁。

考虑列表的迭代实际上是如何工作的:存在一些变量(我们将其称为i),该变量可跟踪当前项目的索引。在循环的每次迭代中,i增加1,并且当i >= len(contents)时循环停止。

[当您从列表中的索引i处删除元素时,该元素之后的所有元素都左移1,以填充所删除元素所在的“间隙”。这意味着先前位于索引i + 1的元素现在位于索引i但是i仍然增加1,为下一次迭代做好准备。

这意味着您接下来读取的下一个元素在索引i + 1处,而该元素过去是在索引i + 2处,因此您跳过了一个元素。

由于这种原因,在for循环中迭代该集合时,切勿从集合中添加或删除元素。


在这种情况下,仅使用continue就足以确保元素不会被写入maczip;它将跳过从contents到下一个元素的循环,因此您也不需要从contents中删除当前元素。以此方式更改代码:

if 'desktop.ini' in item:
    # don't do contents.remove(item)
    continue
© www.soinside.com 2019 - 2024. All rights reserved.