从 tar 文件中读取单个 bz2 文件

Reading individual bz2 files from a tar file

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

2013-01.tar
  01[=11=]\X.json.bz2\X.json
  01\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?

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

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

下面提取 json 文件的代码 return 但是出错了。我将如何逐行检索 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 中 return 缓冲区(如何将其转换为缓冲区?),任何建议都非常重要赞赏。

BZ2File 需要一个文件 name 作为第一个参数,并且您传递一个文件 object (即一个对象具有API 与 Python returns 相同 open()).

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