python - 如何使用 Python FAST 下载和解析 JSON
问题描述
我正在尝试下载 JSON 文件
with urlopen(url_str) as url:
return json.loads(url.read().decode())
而且它的运行速度非常慢(比等效的 Java 代码慢 10 倍以上)。
有没有办法以正常速度执行此操作?
更新
我是这样写的:
def read_json_data(url_str: str):
req = Request(url_str, headers={'Accept-encoding': 'gzip'})
with urlopen(req) as resp:
if resp.info().get('Content-Encoding') == 'gzip':
with gzip.GzipFile(fileobj=resp) as fp:
data = json.load(fp)
else:
data = json.load(resp)
return data
但是出现错误json.load(fp)
:
TypeError: the JSON object must be str, not 'bytes'
为什么?不是json.load
(没有s
)接受文件指针吗?
解决方案
urlopen
supports gzip
, you just have to ask for it:
import urllib.request
import gzip
import json
urlstr = "http://example.com/your-json-url"
req = urllib.request.Request(urlstr,
headers={'Accept-encoding':'gzip'})
resp = urllib.request.urlopen(req)
if resp.info().get('Content-Encoding') == 'gzip':
print("got gzip")
data = json.load(gzip.GzipFile(resp))
else:
print("no gzip")
data = json.load(resp)
推荐阅读
- reactjs - 如果使用 Hook 的初始 setValue 方法,React 不会更新值
- python - 用另一列中的值替换一列中的值,省略 nans python
- node.js - 如何在兔子队列上使用同步消息?
- r - 如何在 sparklyr 中实现 pivot_wider?
- php - Foreach 没有给我任何结果
- build - SE Linux Android 9 AOSP:在 platform_app.te 文件中添加权限导致构建失败
- javascript - 如何过滤具有不同键的对象数组的结果
- android - 我应该在哪里以编程方式下载我的 Android 应用程序的新版本?
- node.js - “npx create-react-app 命令”无法正常工作
- javascript - Firebase 身份验证直接在电子邮件验证上转移到 continueUrl