如何从 gzip 读取 json 字符串
Posted
技术标签:
【中文标题】如何从 gzip 读取 json 字符串【英文标题】:How to read json string from gzip 【发布时间】:2020-12-13 14:35:48 【问题描述】:我正在尝试从 .gz 文件中读取 json 对象。
代码如下:
with gzip.open("C:/Users/shaya/Downloads/sample.gz", 'rb') as fin:
json_bytes = fin.read()
json_str = json_bytes.decode('utf-8')
data = json.loads(json_str)
print(data)
我收到此错误:
JSONDecodeError: Extra data: line 1 column 2 (char 1)
json 字符串无法转换成 json 对象。
【问题讨论】:
错误出现在json.loads(..)
,对吗?如果是这样,您必须显示json_str
的值才能获得帮助。
您正在尝试以 json 格式读取 gzip 压缩文件。我不知道你期待什么。
@Marc codebeautify.org/online-json-editor/cb9ebcda 这是 json_str
@Aplet123 压缩 json 数据然后读入有什么问题??
json syntax 需要以括号开头。您可以将整个第一行替换为
字符
【参考方案1】:
编辑。正如@CharlesDuffy 所建议的,您已将 tar 压缩包压缩为内部带有 JSON 的文件。有关阅读 gzipped tar 的信息,请参阅第二版。第一个版本仅用于读取 gzip。
第一版
我认为您以某种方式错误地压缩/解压缩了 JSON 数据,因为它在解压缩后包含非 JSON 前导字节。
您要么必须从解压缩的数据中剪切/删除前导非 JSON 字节,要么像下面的代码一样重新创建数据。为了您删除前导错误字节的情况,请在json.loads(...)
之前执行json_str = json_str[json_str.find(''):]
。
下面是逐步json编码/gzip压缩/写入文件/从文件读取/gzip解压缩/json解码的完整工作代码:
Try it online!
import json, gzip
# Encode/Write
pydata =
'a': [1,2,3],
'b': False,
jdata = json.dumps(pydata, indent = 4)
serial = jdata.encode('utf-8')
with open('data.json.gz', 'wb') as f:
f.write(gzip.compress(serial))
# Read/Decode
serial, pydata, jdata = None, None, None
with open('data.json.gz', 'rb') as f:
serial = gzip.decompress(f.read())
jdata = serial.decode('utf-8')
pydata = json.loads(jdata)
print(pydata)
输出:
'a': [1, 2, 3], 'b': False
第二版
下面是在 gzipped tar 文件中读取 JSON 的代码。它从 tar 读取第一个 JSON 文件,如果有多个 json 文件,您可以将 fname = ...
替换为 JSON 文件的正确文件名。
import json, gzip, tarfile, io
with open('data.json.tar.gz', 'rb') as f:
tserial = gzip.decompress(f.read())
with tarfile.open(fileobj = io.BytesIO(tserial), mode = 'r') as f:
fname = [e for e in f.getnames() if e.lower().endswith('.json')][0]
serial = f.extractfile(fname).read()
jdata = serial.decode('utf-8')
pydata = json.loads(jdata)
print(pydata)
【讨论】:
文件顶部的额外数据是一个 tar 头。 OP 有一个 tar.gz 文件,其中包含一个 JSON 文件,而不是 json.gz 文件。 @CharlesDuffy 谢谢!添加了第二个代码 sn-p 用于使用 JSON 读取 gzipped tar。以上是关于如何从 gzip 读取 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何将使用 GZIP 压缩的字符串从 Java App 发送到 PHP Web 服务