Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 读取直接从urlrquest压缩的json_Python_Json_Api - Fatal编程技术网

Python 读取直接从urlrquest压缩的json

Python 读取直接从urlrquest压缩的json,python,json,api,Python,Json,Api,我想直接将一个文件读到python,而不必保存它——zip文件相对较小,并且绝对适合mem 我目前正在尝试: import urllib import json access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip') data = json.loads(access_url.read().decode()) 但我得到了一个错误: Unicode

我想直接将一个文件读到python,而不必保存它——zip文件相对较小,并且绝对适合mem

我目前正在尝试:

        import urllib
        import json
        access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip')
        data = json.loads(access_url.read().decode())
但我得到了一个错误: UnicodeDecodeError:“utf-8”编解码器无法解码位置15中的字节0xa0:无效的开始字节

什么额外的步骤可以解决这个问题

我正在使用python 3.6


谢谢

现在,您将压缩的存档(可以包含许多文件)视为包含实际数据的文件。让我们假设您的zip只包含一个文件,其中包含实际的JSON数据。这将有助于:

import zipfile
import io
import urllib
import json

access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip')

z = zipfile.ZipFile(io.BytesIO(access_url.read()))
data = json.loads(z.read(z.infolist()[0]).decode())
print(data)

或者类似的。实际上,我无法对实时数据进行测试,但尝试一下。它基本上将在归档中找到的第一个文件解压缩,然后将其作为json处理

这是一个zip文件,你想要什么?请参见此
https://docs.python.org/2/library/zipfile.html
您的COAL.zip文件具体包含哪些内容?现在的问题是,您将压缩的归档文件视为json数据,这是不对的。您需要从存档中提取包含json数据的实际文件。例如,您知道归档文件中的文件名吗?存档文件包含很多文件吗?@Hannu它包含一个名为COAL.txt的json格式的文件。@RaminNietzsche是的,但我想解压并获取json,而不必将其保存在磁盘中,因为这是小文件。。。
import urllib.request
import json
from io import BytesIO
from zipfile import ZipFile


access_url = urllib.request.urlopen('http://api.eia.gov/bulk/COAL.zip')
zf = ZipFile(BytesIO(access_url.read()))
zdata = zf.read('COAL.txt')

print(zdata)