Python 压缩子文件夹而不是整个文件夹路径

2024-01-08

我有一个程序可以将所有内容压缩到一个文件夹中。我没有编写这段代码,但我在网上找到了它并且我正在使用它。我打算压缩一个文件夹,例如 C:/folder1/folder2/folder3/ 。我想将folder3 及其所有内容压缩到一个文件中,例如folder3.zip。使用下面的代码,一旦我压缩它,folder3.zip的内容将是folder1/folder2/folder3/和文件。我不希望压缩整个路径,我只希望压缩我感兴趣的子文件夹(在本例中为folder3)。我尝试了一些 os.chdir 等,但没有运气。

def makeArchive(fileList, archive):
    """
    'fileList' is a list of file names - full path each name
    'archive' is the file name for the archive with a full path
    """
    try:
        a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)

        for f in fileList:
            print "archiving file %s" % (f)
            a.write(f)
        a.close()
        return True
    except: return False 

def dirEntries(dir_name, subdir, *args):
    # Creates a list of all files in the folder
    '''Return a list of file names found in directory 'dir_name'
    If 'subdir' is True, recursively access subdirectories under 'dir_name'.
    Additional arguments, if any, are file extensions to match filenames. Matched
        file names are added to the list.
    If there are no additional arguments, all files found in the directory are
        added to the list.
    Example usage: fileList = dirEntries(r'H:\TEMP', False, 'txt', 'py')
        Only files with 'txt' and 'py' extensions will be added to the list.
    Example usage: fileList = dirEntries(r'H:\TEMP', True)
        All files and all the files in subdirectories under H:\TEMP will be added
        to the list. '''

    fileList = []
    for file in os.listdir(dir_name):
        dirfile = os.path.join(dir_name, file)
        if os.path.isfile(dirfile):
            if not args:
                fileList.append(dirfile)
            else:
                if os.path.splitext(dirfile)[1][1:] in args:
                    fileList.append(dirfile)
            # recursively access file names in subdirectories
        elif os.path.isdir(dirfile) and subdir:
            print "Accessing directory:", dirfile
            fileList.extend(dirEntries(dirfile, subdir, *args))
    return fileList

你可以通过以下方式调用它makeArchive(dirEntries(folder, True), zipname).

关于如何解决这个问题有什么想法吗?我正在使用 Windows 操作系统和 python 25,我知道在 python 2.7 中,有 Shutil make_archive 可以帮助,但由于我正在使用 2.5,所以我需要另一个解决方案:-/


你必须给出一个arcname论证ZipFile.write() http://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.write使用相对路径。通过给出要删除的根路径来执行此操作makeArchive():

def makeArchive(fileList, archive, root):
    """
    'fileList' is a list of file names - full path each name
    'archive' is the file name for the archive with a full path
    """
    a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)

    for f in fileList:
        print "archiving file %s" % (f)
        a.write(f, os.path.relpath(f, root))
    a.close()

并调用它:

makeArchive(dirEntries(folder, True), zipname, folder)

我已经把毯子拿掉了try:, except:;这里没有任何用处,只是用来隐藏您想了解的问题。

The os.path.relpath() http://docs.python.org/2/library/os.path.html#os.path.relpath函数返回相对于的路径root,有效地从存档条目中删除该根路径。

在 python 2.5 上,relpath功能不可用;对于这个特定的用例,以下替换可以工作:

def relpath(filename, root):
    return filename[len(root):].lstrip(os.path.sep).lstrip(os.path.altsep)

and use:

a.write(f, relpath(f, root))

注意上面的relpath()函数仅适用于您的特定情况filepath保证开始于root;在 Windows 上,一般情况为relpath()要复杂得多。如果可能的话,您确实想升级到 Python 2.6 或更高版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 压缩子文件夹而不是整个文件夹路径 的相关文章

随机推荐

  • 我是否正确使用了 EJB?

    我正在使用 JEE6 堆栈 包括 JPA 2 0 JSF 2 0 EJB 3 1 等 我的架构设置方式如下 我有 JPA 注释的 DAO 使用 hibernate 作为我的 JPA 提供程序 我有与我的facelet xhtml 页面相对应
  • ProGuard - 混淆 apk 导致错误

    当我使用 ProGuard 混淆代码后 我的应用程序出现问题 应用程序启动正常 但一旦我尝试对服务器进行 REST 调用 我会在 LogCat 中收到以下错误 并且应用程序只是挂起 异常 Ljava lang NullPointerExce
  • Ionic - 应用程序挂在启动屏幕上

    我的离子应用程序挂在启动屏幕上 它工作正常 然后我添加了一些代码 并进行了测试 但它被卡住了 事情到了这一步 Debug phase Starting debug of 2e5ac6066864be48322a757c4d0ccdfde52
  • Appcelerator Titanium Android后台定位服务

    我正在尝试制作一个应用程序 如果用户进入特定区域 他会收到警报 即使应用程序处于后台 这也将起作用 我发现 Ti App iOS backgroundService 可以为 iphone 执行此操作 但如何在 android 中启动后台服务
  • KeyEventArgs.systemKey 和 KeyEventArgs.Key 之间的区别

    有什么区别KeyEventArgs systemKey and KeyEventArgs Key 在 WPF Usercontrol 类中捕获按键事件是否可以 如下所示 protected override void OnKeyDown K
  • 如何在 Blazor WebAssembly MSAL 中处理多个资源的令牌

    这个问题没有真正的解决方案 只有各种解决方法 直到 net7 出现 在 net7 中 我们应该再次能够根据以下条件在一次调用中从多个源请求范围 https github com dotnet aspnetcore pull 43954 ht
  • React Native 标题/底部标签栏在第一个应用程序加载时跳转

    我有一个仅包含导航包的应用程序 在 IOS 上 一切都很好 但在 Android 上 标题和 或底部选项卡栏似乎在跳跃 可能需要重新计算它们的位置 仅当我使用导航组件并且仅当应用程序刚刚启动时才会发生这种情况 有没有人遇到同样的问题 提前致
  • 如何在 iOS 7.1 中隐藏状态栏?

    在 iOS 7 0 中 我通过添加隐藏应用程序中的状态栏
  • 重力形式上的 js 错误

    我们在 wpengine 上托管 WordPress 网站 在这个网站上 我们使用重力形式 但由于某种原因它停止工作 我们得到的只是一个 js 错误 Uncaught ReferenceError gformInitSpinner is n
  • 从字符串创建 DOM 文档,无需使用 JQuery

    我们正在寻找方法来创建DOM文档在 javascript 中从字符串中读取 但不使用 Jquery 有办法这样做吗 我认为是这样 因为 Jquery 可以做到 对于那些好奇的人来说 我们不能使用 Jquery 因为我们是在 Chrome 应
  • NodeJS 语法错误:JSON 中位置 0 处出现意外标记

    The bodyAuthorize net 的沙箱 API 的响应是 messages resultCode Error message code E00012 text You have submitted a duplicate of
  • 云源存储库的 HEAD 未指向任何提交

    有没有办法配置云源存储库以将 HEAD 指向最新提交 我在云源存储库中创建了一个新存储库 并且 HEAD 没有指向远程存储库 GCP 中的任何内容 尽管在我的本地存储库中 HEAD 确实指向最新的提交 即使我可以看到远程存储库 云源存储库
  • 当视频播放器不在视野范围内时,将 HTML5 视频设置为暂停

    我想用 JavaScript 来做到这一点 我正在使用 Hakim El Hattab 的演示文稿Reveal js http lab hakim se reveal js 作为基础 Reveal js 的工作方式是 您正在查看的当前幻灯片
  • 使用 ffmpeg.js 将 WebM/H.264 高效转换为 MP4/H.264

    由于这里的答案 使用 WebRTC MediaRecorder 录制跨平台 H 264 视频 https stackoverflow com questions 45221112 recording cross platform h 264
  • 如何在 iOS 中注册 GCM

    我似乎无法让 GCM 推送通知正常工作 我的问题是我不知道如何从 GCM 获取注册 ID 我可以从 APN 获得令牌 但我不太确定下一步该做什么 我尝试按照教程进行操作 但它对我来说并不起作用 我是初学者 所以请明确 我想问的是 从 APN
  • 节是柯里化的结果吗?

    Hutton 的 Haskell 编程 一般来说 如果 是一个运算符 那么表达式的形式 x 和 y 用于论证x and y称为节 其作为函数的含义可以是 使用 lambda 表达式形式化如下 x gt y gt x y x y gt x y
  • Restlet流数据

    我正在执行一项任务 我将从设备读取数据并使其通过网络服务可用 每秒读取数据 4 次 我希望 Web 客户端具有开放的 HTTP 连接 并使用以下方式将设备读数作为流获取分块传输 http en wikipedia org wiki Chun
  • VSX?虚拟MX?阿尔蒂维克?虚拟现实?振动时效?!这些 PowerPC SIMD 缩写词之间有何关系?

    我听说过很多关于 Altivec 寄存器的事 但我什至没有在网上找到它POWER9 指令集架构 https www docdroid net tWT7hjD powerisa v30 pdf 在该文档中 我只在第 6 章 矢量设施 和第 7
  • 如何获取 Android 11 中已安装应用的列表

    开发者网站上描述了这一行 但我没有完全理解它 Call getInstalledApplications or getInstalledPackages Both methods should return a filtered list
  • Python 压缩子文件夹而不是整个文件夹路径

    我有一个程序可以将所有内容压缩到一个文件夹中 我没有编写这段代码 但我在网上找到了它并且我正在使用它 我打算压缩一个文件夹 例如 C folder1 folder2 folder3 我想将folder3 及其所有内容压缩到一个文件中 例如f