我从zipfile中删除文件的唯一方法是创建一个临时zipfile而不删除该文件,然后将其重命名为原始文件名.
在python 2.4中,ZipInfo类有一个属性file_offset,因此可以创建第二个zip文件并将数据复制到其他文件而不进行解压缩/重新压缩.
这file_offset在python 2.6中是缺失的,所以除了通过解压缩每个文件然后再次重新压缩它来创建另一个zipfile之外还有另一种选择吗?
是否有可能直接删除zipfile中的文件,我搜索并没有找到任何东西.
我有archive.zip两个文件:hello.txt和world.txt
我想hello.txt使用该代码覆盖新文件:
import zipfile
z = zipfile.ZipFile('archive.zip','a')
z.write('hello.txt')
z.close()
Run Code Online (Sandbox Code Playgroud)
但它不会覆盖文件,不知何故它会创建另一个实例hello.txt- 看看winzip截图:

既然没有smth zipfile.remove(),那么处理这个问题的最佳方法是什么?
我正在用Python创建一个程序,它下载一组文件并将它们放入带有zipfile模块的存档中.
我已经找到了如何附加到存档,但有些情况下存档中的文件已经存在并且应该被覆盖.
目前,如果我将已存在的文件附加到存档,我会得到重复.
有谁知道如何删除档案中的文件?
我正在尝试更新 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))
Run Code Online (Sandbox Code Playgroud)
当我像这样调用这个函数时:
按预期创建了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 …Run Code Online (Sandbox Code Playgroud)