如何仅提取 .tar.gz 成员的文件?

2024-03-18

我的目标是打开包装.tar.gz文件,而不是指向该文件的子目录。

我的代码基于此question https://stackoverflow.com/questions/4917284/extract-files-from-zip-without-keeping-the-structure-using-python-zipfile除了而不是解压.zip我正在拆包一个.tar.gz file.

我问这个问题是因为我得到的错误非常模糊,并且没有识别出我的代码中的问题:

import os
import shutil
import tarfile

with tarfile.open('RTLog_20150425T152948.gz', 'r:gz') as tar:
    for member in tar.getmembers():
        filename = os.path.basename(member.name)
        if not filename:
            continue

        # copy file (taken from zipfile's extract)
        source = member
        target = open(os.path.join(os.getcwd(), filename), "wb")
        with source, target:
            shutil.copyfileobj(source, target)

正如您所看到的,我从链接的问题中复制了代码,并尝试将其更改为处理 .tar.gz 成员而不是 .zip 成员。运行代码后,我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\dzhao\Desktop\123456\444444\blah.py", line 27, in <module>
    with source, target:
AttributeError: __exit__

从我读过的书来看,shutil.copyfileobj将两个“类似文件”的对象作为输入。member is a TarInfo目的。我不确定是否TarInfoobject 是一个类似文件的对象,所以我尝试更改此行:

source = member #to
source = open(os.path.join(os.getcwd(), member.name), 'rb')

但这会引发找不到文件的错误,这是可以理解的。

我不明白什么?


这段代码对我有用:

import os
import shutil
import tarfile

with tarfile.open(fname, "r|*") as tar:
    counter = 0

    for member in tar:
        if member.isfile():
            filename = os.path.basename(member.name)
            if filename != "myfile": # do your check
                continue

            with open("output.file", "wb") as output: 
                shutil.copyfileobj(tar.fileobj, output, member.size)

            break # got our file

        counter += 1
        if counter % 1000 == 0:
            tar.members = [] # free ram... yes we have to do this manually

但您的问题可能不是提取,而是您的文件确实不是 .tar.gz 而只是 .gz 文件。

编辑:此外,您还会在 with 行上收到错误,因为 python 正在尝试调用__enter__ https://stackoverflow.com/questions/1984325/explaining-pythons-enter-and-exit成员对象的函数(不存在)。

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

如何仅提取 .tar.gz 成员的文件? 的相关文章

随机推荐

  • 如何设置vuetify卡片的高度

    我正在尝试使用 vue 和 vuetify 添加一张卡 它将占用容器中的空间 使用 v flex 创建一张水平卡 其垂直方向的作用相同 我尝试使用 fill height child flex 等添加 100 的高度样式 但我无法获取卡片的
  • ActionBarSherlock - SearchView 为空?

    我正在 SherlockListActivity 中的操作栏中添加搜索功能 但是 当我尝试实例化 SearchView 时 它始终为 null Override public boolean onCreateOptionsMenu Menu
  • 这个 FIRST_VALUE 查询有什么问题?

    查询如下 with t as select 450 id null txt 3488 id usr from dual union all select 449 null 3488 from dual union all select 79
  • PyDev 不执行将当前行发送到控制台的快捷方式

    According to this question https stackoverflow com questions 24380281 liclipse and execute codes in console shortcuts an
  • 是否可以生成动态sql来返回雪花中具有各种列的行

    我们将各种数据作为值 对存储在 JSON 列中 所有行的对名称都不相同 并且取决于某些元数据 有没有办法编写一个 SQL 语句来根据某些元数据检索其中一些值对 类似动态生成的东西 SELECT MyJson FruitShape MyJso
  • nextjs 预渲染所有页面还是仅预渲染第一页?

    我正在学习 nextjs 并在某些地方读到 nextjs 仅预渲染第一页 而在其他一些地方他们说 nextjs 默认情况下预渲染所有页面 所以我无法理解哪一个是正确的 有不同的渲染策略 您可以通过在页面文件中添加方法来选择 Next Js
  • 如何确定 SSIS 数据集中的行数

    我经常在 SSIS 包中遇到这样的情况 运行 SQL 命令从 ADO 连接返回一组行 在某些情况下 我想根据返回的行数进行分支 ado 结果集存储在 SSIS 对象 数据类型中 SSIS 表达式或脚本组件中有没有办法获取行数 不要使用执行
  • Playframework 进化文件与 postgres 和 h2 兼容

    我一直在使用 H2 作为后端 使用 Play 框架 scala 开发一个网站 测试集成得很好 尤其是能够针对内存中的 H2 数据库运行测试 现在 出于各种方便的原因 我想将我的数据存储转移到 Postgres 这给我留下了一个问题 如何继续
  • 如何从命令行调用带参数的 mysql 存储过程?

    如何从命令行调用存储过程 我有一个程序 CREATE DEFINER root localhost PROCEDURE insertEvent IN dateTimeIN DATETIME NO SQL BEGIN SET eventIDO
  • 为什么我在使用 Ionic Framework 插件 healthkit 时收到错误plugin_not_installed?

    我已经使用 Ionic Framework 一段时间了 但最近遇到了这个错误plugin not installed对于 Health Kit 插件 我知道我有基于我的ionic cordova plugin list output ion
  • 批量插入时如何自动截断字符串?

    我想将许多行 从实体框架对象构造 插入到 SQL Server 问题是 某些字符串属性的长度超过了数据库中列的长度 这会导致异常 然后所有行将无法插入到数据库中 所以我想知道是否有办法告诉 SqlBulkCopy 自动截断任何超长的行 当然
  • 使用加法、减法和减半计算三角根

    特定游戏的规则是角色的力量与角色的力量成正比 三角根 https math stackexchange com q 698961 93170角色的经历 例如 15 20经验获得5力量 21 27经验获得6力量 28 35经验获得7力量等等
  • UIWebView 以更有效的方式减少加载时间

    我正在下载多个 html 并将它们作为字符串保存在本地NSArray 然后我用3UIWebViews加载内容 用户总是看到一个UIWebView还有 2 个UIWebViews使用以下方式在后台加载 firstWebView loadHTM
  • 将属性添加到 php 中对象顶部的 stdClass

    当创建一个对象时php用于返回 JSON 是否可以添加一个属性并强制它位于顶部 我想要这个 因为该对象是通过 API 公开的 并且最好在顶部有 id 例如 obj new stdClass obj gt name John obj gt a
  • 如何在 C++ 中限制生成的程序可以使用的内存量

    在我的 C 程序中 我将启动其他程序 如果这些程序使用超过一定量的内存 我希望我的程序杀死它们的进程 那怎么办呢 我可能会使用 execv 来启动程序 假设您使用的是 POSIX 系统 您可以通过调用来限制这一点setrlimit 2 af
  • Linux 上的 .NET core X509Store

    使用 NET Core 2时 Linux中的证书文件位于哪里X509Store 在 Windows 上 可以从管理控制台访问证书certlm msc或与New SelfSignedCertificate在 powershell 中 使用 N
  • 为什么 Xcode 6 将动态链接编辑器库中的自动完成功能保持为 TRUE?

    我仍在学习 Swift 和 iOS 开发 但我一直遇到这个问题 尽管我尝试深入了解一下 但我仍然有点困惑 当我开始打字时trueXcode 6 建议自动完成TRUE 不是世界末日 然而 有一次我决定看看如果我使用会发生什么TRUE结果给了我
  • Spring尤里卡中的instanceid是什么?

    我读到 Eureka 客户端的实例 ID 必须是唯一的 当我们希望运行同一 Eureka 客户端的多个实例时 我们添加此属性 eureka instance instance id spring cloud client hostname
  • 如何依次请求多个权限?

    我的应用程序需要访问CAMERA and 写外部存储权限 一旦我的应用程序加载 我想要求用户依次允许这两个权限 我有这个代码 if ContextCompat checkSelfPermission this Manifest permis
  • 如何仅提取 .tar.gz 成员的文件?

    我的目标是打开包装 tar gz文件 而不是指向该文件的子目录 我的代码基于此question https stackoverflow com questions 4917284 extract files from zip without