我正在尝试更新zip存档中的文件并将其另存为新存档。我使用的zip存档是一个excel .xlsm
文件,我需要修改的文件位于子文件夹中:xl/vbaProject.bin
。我写了一个函数(通过修改这里发布的函数:How to update one file inside zip file using python)。
def updateZip2(zip_name, file, data):
# generate a temp file
tmp = os.path.splitext(ntpath.basename(zip_name))[0] + '_new.xlsm'
tmpname = str(pathlib.Path(zip_name).parent.joinpath(tmp))
print(tmpname)
with zipfile.ZipFile(zip_name, 'r') as zin:
with zipfile.ZipFile(tmpname, 'w') as zout:
zout.comment = zin.comment # preserve the comment
for item in zin.infolist():
if item.filename.find(file) == -1:
zout.writestr(item, zin.read(item.filename))
当我这样调用这个函数时:
updateZip2('Book1.xlsm', r'xl\vbaProject.bin', target2)
按预期创建新的Book1_new.xlsm
,但我收到警告:
C:\ProgramData\Anaconda3\lib\zipfile.py:1355: UserWarning: Duplicate name: 'xl/vbaProject.bin'
return self._open_to_write(zinfo, force_zip64=force_zip64)
当我用WinZip打开文件时,我可以看到vbaProject.bin是重复的。任何想法为什么以及如何纠正此行为以复制zip 中的所有文件,除了 xl\vbaProject.bin
答案 0 :(得分:1)
您传递给file
的{{1}}是:
updateZip2()
但存储在ZIP中的文件格式为:
r'xl\vbaProject.bin'
因此,如果您在通话中将r'xl/vbaProject.bin'
更改为\
,那么它应该有效:
/
或者,您可以将您的相等测试更新为:
updateZip2('Book1.xlsm', r'xl/vbaProject.bin', target2)