我目前正在为我的 python 程序编写一个更新程序。它下载一个 zip 文件,然后使用 zipfile 模块打开它。我循环遍历 zip 中的所有文件,如果该文件不是名为“updater.exe”,则将其解压到当前目录。然而,程序在解压一个文件后停止。我见过有人遇到类似的问题,但答案似乎是使用 extractall,我不能这样做,因为我无法提取 updater.exe,因为该文件将被覆盖,而这就是将运行来执行此任务的程序。我确实希望其他所有内容都被覆盖。我还使用 wxpython 作为进度对话框。这是我用来打开 zip 文件并解压的代码。
with ZipFile('wotu.zip', 'r') as f:
files=f.namelist()
dlg=wx.ProgressDialog('Updating', 'Extracting files...', len(files))
progress=0
for file in files:
if file != 'updater.exe':
print(file)
f.extract(file)
progress+=1
dlg.Update(progress)
经过一番研究,我了解到您可以将文件列表传递给 extractall 函数,因此我所要做的就是迭代名称列表中的文件列表并弹出我不想提取的文件。这是我使用的代码。
with ZipFile('wotu.zip', 'r') as f:
files=f.namelist()
dlg=wx.ProgressDialog('Updating', 'Extracting files...', len(files))
progress=0
for file in range(len(files)):
if files[file] == 'updater.exe':
files.pop(file)
break
f.extractall(members=files)