Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从gzip读取json字符串_Python_Json_Gzip - Fatal编程技术网

Python 如何从gzip读取json字符串

Python 如何从gzip读取json字符串,python,json,gzip,Python,Json,Gzip,我试图从.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 da

我试图从.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对象。

编辑。正如@CharlesDuffy所建议的,您已经用JSON压缩了tar归档文件。请参阅第二版以了解gzip tars。第一个版本仅用于阅读gzip

第一版

我认为您在某种程度上错误地压缩/解压了JSON数据,因为解压后它包含非JSON前导字节

您必须从解压缩的数据中剪切/删除前导的非JSON字节,或者像下面的代码那样重新创建数据。对于要删除前导错误字节的案例,请在
json.load(…)
之前执行
json\u str=json\u str[json\u str.find('{'):]

下面是逐步json编码/gzip压缩/写入文件/读取文件/gzip解压缩/json解码的完整工作代码:

输出:

{'a': [1, 2, 3], 'b': False}

第二版

下面是在Gzip tar文件中读取JSON的代码。它从tar中读取第一个JSON文件,如果有多个JSON文件,您可以用正确的JSON文件名替换
fname=…

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)

错误在
json.loads(..)上
,对吗?如果是这样,您必须显示
json\u str
的值才能获得帮助。您正在试图以json的形式读取Gzip文件。我不知道您期望的是什么。@Marc这是json_str@Aplet123压缩json数据并随后读入有什么问题?需要从括号开始。您可以替换整个第一个li带有
{
字符的ne文件顶部的额外数据是一个tar头。OP有一个包含JSON文件的tar.gz文件,而不是一个JSON.gz文件。@CharlesDuffy谢谢!添加了第二个代码段,用于读取带有JSON的Gzip tar。
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)