如何绕过已经在python中关闭的zip存档?

如何绕过已经在python中关闭的zip存档?,python,zipfile,Python,Zipfile,我创建了一个脚本,将用户指定的文件夹作为zip文件备份到用户指定的位置,我可以运行该脚本一次,但如果再次运行该脚本并对zip文件名使用相同的参数,则会出现以下错误 Attempt to write to ZIP archive that was already closed 邮政编码如下: bkZip = zipfile.ZipFile(backZip, 'w') # Not sure what to say for lines 26 - 31 for dirname, subdirs, fi

我创建了一个脚本,将用户指定的文件夹作为zip文件备份到用户指定的位置,我可以运行该脚本一次,但如果再次运行该脚本并对zip文件名使用相同的参数,则会出现以下错误

Attempt to write to ZIP archive that was already closed
邮政编码如下:

bkZip = zipfile.ZipFile(backZip, 'w') # Not sure what to say for lines 26 - 31
for dirname, subdirs, files in os.walk(backUp): 
    bkZip.write(dirname)
    for filename in files:
        bkZip.write(os.path.join(dirname, filename))
    bkZip.close()

我不完全确定如何解决这个问题,需要一点帮助。

取决于您希望发生什么

您可以检查目标文件名的文件是否已经存在,然后更改名称(例如my_zip_file.zip.old)或删除它:

if os.path.exists(foo):
    os.remove(foo)
或者,您可以打印警告并要求用户删除现有存档或中止

或者,如果您的目的是附加到存档中,您可以:

  • 从旧备份中提取所有内容
  • 删除现有备份
  • 然后将旧备份和当前输出的组合写入新存档
试试这个:

for dirname, subdirs, files in os.walk(backUp):
    bkZip.write(dirname)
    for filename in files:
        bkZip.write(os.path.join(dirname, filename))
bkZip.close()

计划是检查目标文件名是否已经存在,然后删除它以进行新的测试。zipWell这会删除文件,但脚本会将文件移动到用户指定的另一个目录。那么我如何让它删除指定目录中的文件呢?这是要查看的整个脚本。McGrady的回答修复了我的主要问题,但我的另一个问题是,在通过脚本移动文件后删除该文件,这似乎是一个我无法解决的问题。与其使用
shutil.move()
将存档文件放在您想要的位置,为什么不直接在正确的位置创建它呢?如'bkZip=zipfile.zipfile(os.path.join(dest,backZip),'w')中所示。这还可以避免当前的问题,即必须检查两个位置是否有可能存在较旧的备份。好的,但是如果os.path.exists(foo)存在,如何检查dest、backZip:bkZip.close()真的应该在顶级循环中缩进吗?这显然是错误的,但也可能是将代码复制到堆栈溢出编辑器的结果,而不是真正代码中问题的原因。如果这句话真的是这样的话,我希望您的备份在
备份
位置的任何子文件夹中都会失败(无论您运行脚本多少次)。谢谢您刚刚修复了一个“文件已存在错误”还有一个问题是将我的文件夹备份为
zipfile://home/akeno/Desktop/BootStrap/
而不是
zipfile://BootStrap/