python - 从 API 使用 JSON 时如何修复无效的源参数
问题描述
我试图从polygon.io API 中提取财务数据以对其进行组织,然后将其注入Azure 数据库。为了实现这一点,我一直在使用“petl”python 包,但我从示例表开始遇到问题,因为我认为这是由我检索和编写 JSON 结果的方式引起的无效源参数。
import petl as etl
import websocket
import json
import requests
r =requests.get("https://api.polygon.io/v1/historic/forex/AUD/USD/2018-2-2?limit=1&apiKey=*********")
#gets data includes plenty of responses that arnt text
data = json.loads(r.text)
table1 = etl.fromjson(data, header=['day','map','msLatency','pair','status','ticks','type'])
print(table1)
我希望一个表的列标题是下面列出的值,但收到了以下错误消息:"AssertionError: invalid source argument, expected None or a string or an object implementing open()"
从 API 打印数据时,它看起来像这样:
{'day': '2018-2-2', 'map': {'a': 'ask', 'b': 'bid', 't': 'timestamp'}, 'msLatency': 1, 'pair': 'AUD/USD', 'status': 'success', 'ticks': [{'b': 0.80392, 'a': 0.80392, 'x': 0, 't': 1517529600225}], 'type': 'forex'}
我曾尝试转换数据或使用 api 调用行作为数据参数,但收效甚微
解决方案
该petl.fromjson
调用需要一个字符串(本地文件的路径)或无(stdin)。您已从 URL 中提取 JSON(文本)并将其转换为 Python 字典。因此,您应该考虑字典,而不是源的 JSON 格式。我可以看到几种可能的解决方案:
- 不要运行
json.load
,只需将响应写入临时文件,然后在文件上调用petl.fromjson。 - 不要使用petl.fromjson,因为您的数据不再是 JSON,请使用petl.fromdicts,它可以从字典中加载。(实际上,在代码内部,petl.fromjson 本质上是调用
json.load
,然后调用petl.fromdicts。 - 如果您处理大量数据,那么您可能希望将请求包装在io Helper中,以便它在读取并传递给其他 PETL 函数时从 URL 中提取。
推荐阅读
- android - 如何去除顶部状态栏黑色背景
- tableau-api - 根据 Sql 值过滤
- javascript - 使用 DOM 子节点和数据传播进行更新
- ios - 从 iOS 创建 getStream 用户
- javascript - 如何将 JavaScript 数组转换为对象?
- apache-kafka-streams - java.lang.IllegalStateException:这不应该发生,因为 headers() 只应在处理记录时调用
- magento - 单次查询删除客户地址
- android - ffmpeg 库在 LTR 方向转换布局
- python - 如何在自定义 keras 损失函数中计算属于一个标签类的元素?
- entity-framework-6 - 从外部更改数据库并首先使用代码访问该数据库