繁体   English   中英

python-更新zip存档时文件重复

[英]python - file duplicated when updating zip archive

我正在尝试更新zip存档中的文件,并将其另存为新存档。 我使用的zip存档是一个excel .xlsm文件,我需要修改的文件位于子文件夹xl/vbaProject.bin 我编写了一个函数(通过修改此处发布的函数: 如何使用python更新zip文件中的一个文件 )。

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

file是要传递到updateZip2()是:

r'xl\vbaProject.bin'

但ZIP中存储的文件具有以下格式:

r'xl/vbaProject.bin'

因此,如果您在通话中将\\更改为/ ,则它应该可以工作:

updateZip2('Book1.xlsm', r'xl/vbaProject.bin', target2)

或者,您可以将相等性测试更新为:

if os.path.normpath(item.filename) != os.path.normpath(file):

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM