首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用`tarfile`解压存档时出错

使用`tarfile`解压存档时出错
EN

Stack Overflow用户
提问于 2019-09-11 22:46:28
回答 2查看 1.7K关注 0票数 1

我在尝试使用the tarfile library解压.tar.gz存档时遇到错误。

下面是相关的代码片段:

代码语言:javascript
复制
# `gzip_archive_bytes_content` is the content of the gzip archive, in "bytes" format
repo_sources_file_object = io.BytesIO(gzip_archive_bytes_content)
repo_sources_tar_object = tarfile.TarFile(fileobj=repo_sources_file_object)
repo_sources_tar_object.extractall(path="/tmp/")

下面是我得到的错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/tarfile.py", line 186, in nti
    s = nts(s, "ascii", "strict")
  File "/usr/local/lib/python3.7/tarfile.py", line 170, in nts
    return s.decode(encoding, errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9a in position 1: ordinal not in range(128)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/tarfile.py", line 2289, in next
    tarinfo = self.tarinfo.fromtarfile(self)
  File "/usr/local/lib/python3.7/tarfile.py", line 1095, in fromtarfile
    obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors)
  File "/usr/local/lib/python3.7/tarfile.py", line 1037, in frombuf
    chksum = nti(buf[148:156])
  File "/usr/local/lib/python3.7/tarfile.py", line 189, in nti
    raise InvalidHeaderError("invalid header")
tarfile.InvalidHeaderError: invalid header

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/local/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/local/lib/python3.7/site-packages/my-package/__main__.py", line 87, in <module>
    function(**function_args)
  File "/usr/local/lib/python3.7/site-packages/my-package/chart.py", line 107, in reinstall
    install()
  File "/usr/local/lib/python3.7/site-packages/my-package/chart.py", line 89, in install
    repo_sources_tar_object = tarfile.TarFile(fileobj=repo_sources_file_object)
  File "/usr/local/lib/python3.7/tarfile.py", line 1484, in __init__
    self.firstmember = self.next()
  File "/usr/local/lib/python3.7/tarfile.py", line 2301, in next
    raise ReadError(str(e))
tarfile.ReadError: invalid header

Python版本: 3.7

EN

回答 2

Stack Overflow用户

发布于 2019-09-11 22:46:28

我从直接实例化tarfile.TarFile object切换到使用the tarfile.open() constructor,它修复了它:

代码语言:javascript
复制
repo_sources_tar_object = tarfile.open(fileobj=repo_sources_file_object)

在文档中实际上有一个关于这一点的警告,here

不要直接使用此类:改用tarfile.open()。

票数 0
EN

Stack Overflow用户

发布于 2021-02-24 06:19:18

最佳实践是使用上下文管理器,以便在作业完成时自动关闭文件。

你可以这样写:

代码语言:javascript
复制
import contextlib
import io
import tarfile

gzip_archive_bytes_content = b"..."
repo_sources_file_object = io.BytesIO(gzip_archive_bytes_content)

with contextlib.closing(tarfile.open(fileobj=repo_sources_file_object)) as arch:
    arch.extractall(path="/tmp/")

这在tarfile.TarFile中可用,但在tarfile.open()中不可用。所以你可以这样写:

代码语言:javascript
复制
with tarfile.TarFile(...) as arch:
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57891683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档