python-3.x Json文件解析字符串索引必须是整数,而不是“str”错误

68de4m5k  于 2022-12-30  发布在  Python
关注(0)|答案(1)|浏览(148)

我在用python编写一个小机器人时遇到了一个问题。我从api中检索到了一个Json文件,如下所示:

> {
> "10000NFTUSDT": {
> "ret_code": 0,
> "ret_msg": "OK",
> "ext_code": "",
> "ext_info": "",
> "result": \[
> {
> "symbol": "10000NFTUSDT",
> "period": "60",
> "start_at": 1671559200,
> "open": 0.004533,
> "high": 0.004538,
> "low": 0.004523,
> "close": 0.004535
> },
> {
> "symbol": "10000NFTUSDT",
> "period": "60",
> "start_at": 1671562800,
> "open": 0.004535,
> "high": 0.004537,
> "low": 0.004531,
> "close": 0.004533
> },
> {
> "symbol": "10000NFTUSDT",
> "period": "60",
> "start_at": 1671566400,
> "open": 0.004533,
> "high": 0.00454,
> "low": 0.004533,
> "close": 0.004534
> },

我试图从每个硬币中提取收盘价(然后将它们相互比较),但我在提取过程中卡住了。我的主文件看起来像这样:

import json
from func_cointegration import get_cointegrated_pairs

\#STEP 3 Find Cointegrated pairs
print("Calculating co-integration...")
with open("1_price_list.json") as json_file:
price_data = json.load(json_file)
if len(price_data) > 0:
coint_pairs = get_cointegrated_pairs(price_data)

我调用使用extract_close_prices的get_cointegrated_pairs
一个二个一个一个
我不明白为什么我不能用键"close"访问"price_values"。我认为用load打开json文件可以确保它作为字典加载,我正在学习一个教程,那个家伙运行了一个类似的代码,没有这个"typeError"问题。我想用我json文件中的所有收盘价来填充我的"close_price"列表。你知道我做错了什么吗?

Traceback (most recent call last):
  File "/Users/xxxxxxxx/PycharmProjects/StatArbBot/Strategy/main.py", line 27, in <module>
    coint_pairs = get_cointegrated_pairs(price_data)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xxxxx/PycharmProjects/StatArbBot/Strategy/func_cointegration.py", line 35, in get_cointegrated_pairs
    series_1 = extract_close_prices(prices[sym_1])
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xxxxx/PycharmProjects/StatArbBot/Strategy/func_cointegration.py", line 12, in extract_close_prices
    if math.isnan(price_values["close"]):
                  ~~~~~~~~~~~~^^^^^^^^^
TypeError: string indices must be integers, not 'str'
rqenqsqc

rqenqsqc1#

所以我试着复制你的代码和问题。
原来您正在传递一个字典并试图迭代它。
for price_values in prices:在您的extract_close_prices函数中。
因此,您需要迭代到嵌套在字典中键result下的列表,如下所示:
for price_values in prices['result']:
然后尝试查看列表项是否不是数字,由于它是if math.isnan(price_values):的对象(字典技术),因此返回一个空列表。
相反,您需要检查密钥close的值是否为如下数字:if math.isnan(price_values["close"])
在此之后,您的其余代码应该可以工作。
这是我根据您发布的问题创建的工作副本。
https://gist.github.com/HH0718/a6dcfa07c0eb2f83070f01544d04270c
原始答案如下:
您正试图从嵌套在JSON文件中的列表中获取一个项目。
因此,你需要提供你要查找的项的索引。一旦你提供了列表中该项的索引,你就可以得到那个对象的值。
注意"result"是一个列表:

"result": [ { "symbol": "10000NFTUSDT", "period": "60", "start_at": 1671559200, "open": 0.004533, "high": 0.004538, "low": 0.004523, "close": 0.004535 },...

[所示
例如:

response.get("10000NFTUSDT").get("result")[0].get["close"]

会得到你的,0.004535

相关问题