【问题标题】:Reading individual bz2 files from a tar file从 tar 文件中读取单个 bz2 文件
【发布时间】:2015-01-05 16:52:54
【问题描述】:

我正在尝试读取 tar 文件中的许多 bz2 文件,文件具有以下结构:

2013-01.tar
  01\01\00\X.json.bz2\X.json
  01\01\02\X.json.bz2\X.json

我可以得到如下文件名:

import tarfile
tar = tarfile.open(filepath, 'r')
tar_members_names = [filename for filename in tar.getnames()]
# Side question: How would I only return files and no directories?

返回 .bz2 文件的列表。现在我正在尝试(暂时)使用以下方法提取它们:

inner_filename = tar_members_names[0]
t_extract = tar.extractfile(inner_filename)

但是,以下用于提取 json 文件的代码会返回错误。我将如何逐行检索 JSON 文件?

import bz2
txt = bz2.BZ2File(t_extract)
TypeError: coercing to Unicode: need string or buffer, ExFileObject found
txt = bz2.decompress(t_extract)
TypeError: must be convertible to a buffer, not ExFileObject

我一直无法弄清楚如何从 tar 文件而不是当前的 ExFileObject 返回缓冲区(如何将其转换为缓冲区?),非常感谢任何建议。

【问题讨论】:

  • 就像错误所说的那样,您传递的是 ExFileObject,而不是像“extractfile”期望的字符串或 TarInfo 对象。

标签: python tar


【解决方案1】:

BZ2File 需要一个文件 name 作为第一个参数,然后你传递一个文件 object(即一个对象,它与 Python 返回的 open() 具有相同的 API )。

要做你想做的事,你必须自己从t_extract读取所有字节并调用bz2.decompress(data)或使用BZ2Decompressor通过它流式传输数据。

【讨论】:

  • 感谢您的回答,它解决了问题所在。你能提供一个关于我在哪里可以找到如何做到这一点的提示吗?我是否必须先将提取的文件保存到磁盘并从那里读取?
  • 这取决于文件大小。如果它很小,您可以将其全部读入缓冲区 (data = t_extract.read()) 并通过调用 bz2.decompress(data) 进行解压缩。否则,您必须使用临时文件并通过BZ2Decompressor流式传输数据
  • 感谢您的澄清。它们相当小,所以缓冲区应该可以工作。
  • 我有最后一个问题。读取 data = t_extract.read() 时,我要检索什么样的对象?打印 type(t_extract.read()) 实际上打印文件的全部内容(缓冲区?)。我已经能够使用 txt = bz2.decompress(data) & 'for line in txt.split('\n')' 对其进行迭代,但这似乎比我应该做的更重要。有什么想法吗?
  • read() 返回文件的内容。内置的 Python 2.x 方法将返回一个 str 对象。见docs.python.org/2/library/stdtypes.html#bltin-file-objectsPython 3 更复杂:docs.python.org/3/glossary.html#term-file-object
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多