【问题标题】:Extracting zip Overwrite by default?默认情况下提取zip覆盖?
【发布时间】:2017-05-31 10:35:53
【问题描述】:

我有以下代码:

pz = open(packagezip, 'rb')

packz = zipfile.ZipFile(pz)
for name in packz.namelist():
    packz.extract(name, package_ext_loc)

pz.close()

如果要从中提取的文件 (packagezip) 在目标位置 (package_ext_loc) 中遇到同名的文件夹,此功能是否会自动覆盖文件夹和文件,因为这 IS 我想要什么,如果没有,是否有一个简单的附加脚本来强制发生这种情况。

编辑已经浏览了一些网站,如果目标文件夹已经存在,我相信 zipfile.extractall 会覆盖。在这个例子中如何使用 extractall。

【问题讨论】:

  • 所以您编写了代码,但没有运行代码来验证行为。相反,您选择在这里请某人运行您的代码。对吗?

标签: python zipfile


【解决方案1】:

我已经测试了您的代码,它运行良好。这意味着每次我运行代码时,它都会覆盖文件夹中相同的现有文件。

【讨论】:

    【解决方案2】:

    我已经采取了一种方法来确保如果有重复的文件夹,它们会像这样被删除,

    packagezip = xbmc.translatePath('special://home/userdata/addon_data/plugin.program.super.favourites/Super Favourites/Maintenance/packages/packages.zip')
    userdatapackagezip = xbmc.translatePath('special://home/userdata/addon_data/plugin.program.super.favourites/Super Favourites/Maintenance/packages/addondata.zip')
    
    package_ext_loc = xbmc.translatePath('special://home/addons/')
    addondata_ext_loc = xbmc.translatePath('special://home/userdata/addon_data/')
    yespackage = os.path.exists(packagezip)
    yesaddondata = os.path.exists(userdatapackagezip)
    
    if yespackage:
        xbmc.executebuiltin("Notification(New Packages available, Extracting,()")
        pz = open(packagezip, 'rb')
        packz = zipfile.ZipFile(pz)
        for name in packz.namelist():
            addonpath = xbmc.translatePath('special://home/addons/' + name)
            addonpathexists = os.path.exists(addonpath)
            if addonpathexists:
                xbmc.executebuiltin("Notification(Previous version exists, removing,()")
                shutil.rmtree(addonpath, ignore_errors=False)
                xbmc.executebuiltin("Notification(Please wait, preparing extraction,()")
                time.sleep(3)
                packz.extract(name, package_ext_loc)
                xbmc.executebuiltin("Notification(Extracted, REBOOT REQUIRED,()")
            else:
                xbmc.executebuiltin("Notification(No previous version, Extracting,()")
                packz.extract(name, package_ext_loc)
                xbmc.executebuiltin("Notification(Extracted, REBOOT REQUIRED,()")
        pz.close()
        xbmc.executebuiltin("Notification(Packages Extracted, checking addondata,()")
    
        if yesaddondata:
            xbmc.executebuiltin("Notification(Extracting addondata, Please wait!,()")
            adz = open(userdatapackagezip, 'rb')
            paddz = zipfile.ZipFile(adz)
            for name in paddz.namelist():
                addondatapath = xbmc.translatePath('special://home/userdata/addon_data/' + name)
                addondataexists = os.path.exists(addondatapath)
                if addondataexists:
                    xbmc.executebuiltin("Notification(Previous data folder esists, now removing,()")
                    shutil.rmtree(addondatapath, ignore_errors=False)
                    xbmc.executebuiltin("Notification(Please wait, preparing extraction,()")
                    time.sleep(3)
                    paddz.extract(name, addondata_ext_loc)
                    xbmc.executebuiltin("Notification(Extracted, maybe needs Reeboot,()")
                else:
                    xbmc.executebuiltin("Notification(No previous version, Extracting,()")
                    paddz.extract(name, addondata_ext_loc)
            adz.close()
        else:
            xbmc.executebuiltin("Notification(No addondata, at this time,()")
    
    else:
        xbmc.executebuiltin("Notification(No packages, at this time,()")
        xbmc.executebuiltin("Notification(Checking addondata, for extraction,()")
        if yesaddondata:
            xbmc.executebuiltin("Notification(Extracting addondata, Please wait!,()")
            adz = open(userdatapackagezip, 'rb')
            paddz = zipfile.ZipFile(adz)
            for name in paddz.namelist():
                addondatapath = xbmc.translatePath('special://home/userdata/addon_data/' + name)
                addondataexists = os.path.exists(addondatapath)
                if addondataexists:
                    xbmc.executebuiltin("Notification(Previous data folder esists, now removing,()")
                    shutil.rmtree(addondatapath, ignore_errors=False)
                    xbmc.executebuiltin("Notification(Please wait, preparing extraction,()")
                    time.sleep(3)
                    paddz.extract(name, addondata_ext_loc)
                    xbmc.executebuiltin("Notification(Extracted, maybe needs Reeboot,()")
                else:
                    xbmc.executebuiltin("Notification(No previous version, Extracting,()")
                    paddz.extract(name, addondata_ext_loc)
            adz.close()
        else:
            xbmc.executebuiltin("Notification(No addondata, at this time,()")
    

    我不确定 zipfile 是否会自动覆盖 这个kode是一个kodi维护插件

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2019-08-13
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2012-02-29
      • 2013-08-31
      相关资源
      最近更新 更多