对于初学者来说,我是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()
在遍历列表(或其他集合)时,从列表(或其他集合)中删除某物时,警笛声应响起,警告灯应闪烁。
考虑列表的迭代实际上是如何工作的:存在一些变量(我们将其称为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