繁体   English   中英

如何遍历JSON数据中的值?

[英]How to loop over values in JSON data?

我有一些要循环播放的JSON(简体):

{
"Meta Data": {
    "1. Information": "Daily Prices (open, high, low, close) and Volumes",
    "2. Symbol": "TGT",
    "3. Last Refreshed": "2018-11-20 14:50:52",
    "4. Output Size": "Compact",
    "5. Time Zone": "US/Eastern"
},
"Time Series (Daily)": {
    "2018-11-20": {
        "1. open": "67.9900",
        "2. high": "71.5000",
        "3. low": "66.1500",
        "4. close": "69.6800",
        "5. volume": "15573611"
    },
    "2018-11-19": {
        "1. open": "79.9300",
        "2. high": "80.4000",
        "3. low": "77.5607",
        "4. close": "77.7900",
        "5. volume": "9126929"
    }
}

日期是我不知道的值,并且每天都会更改,因此我想遍历它们并用开,高,低等打印日期。到目前为止,我所能做的就是遍历日期并打印它们,但是当我尝试获取其他值(对JSON读取是新的)时,失败,并显示以下代码:

import urllib.parse
import requests

code = 'TGT'
main_api = ('https://www.alphavantage.co/query? function=TIME_SERIES_DAILY&symbol=' +
            code + '&apikey=RYFJGY3O92BUEVW4')
url  = main_api + urllib.parse.urlencode({'NYSE': code})

json_data = requests.get(url).json()
#print(json_data)

for item in json_data['Time Series (Daily)']:
    print(item)
    for item in json_data[item]:
        print(item)

我也尝试做:

for v in json_data:
    print(v['1. open'])

除了嵌套之外,它仍然无法工作。 在两次尝试中,我都得到相同的错误:

Traceback (most recent call last):
   File "jsonreader.py", line 26, in <module>
      for item in item['Time Series (Daily)'][item]:
TypeError: string indices must be integers

因此,有人知道如何遍历所有日期并从中找出开盘价,最高价,最低价等吗?

完整版本的JSON 在此处提供

您可以将其视为字典来实现。 尝试将以下内容作为循环,您将能够提取所需的结果:

for key,value in json_data['Time Series (Daily)'].items():
        print("Date: " + key) #This prints the Date
        print("1. open: " + value["1. open"])
        print("2. high: " + value["2. high"])
        print("3. low: " + value["3. low"])
        print("4. close: " + value["4. close"])
        print("5. volume: " + value["5. volume"])
        print("-------------")

这是一段日期的输出片段:

Date: 2018-07-02
1. open: 75.7500
2. high: 76.1517
3. low: 74.7800
4. close: 75.7700
5. volume: 3518838
-------------

我使用json_data['Time Series (Daily)']并将其分配给它自己的变量,以使其更容易在for循环中引用。

然后在遍历时,您必须引用该变量以访问日期键中的值。

data = json_data['Time Series (Daily)']

for item in data:
    print(item)
    print("open", data[item]["1. open"])
    print("high", data[item]["2. high"])
    print("low", data[item]["3. low"])
    print("close", data[item]["4. close"])
    print("vloume", data[item]["5. volume"])
    print()

嘿,这里的主要主题不是JSON本身,而​​是字典,它是Python中的内置类型。 我不完全知道您要如何处理这些数据,但是访问数据的一种方法是访问字典附带的方法。 像dict.keys(),dict.items()和dict.values()一样,您可以查询一些文档。 我将举例说明如何访问数据,希望对您有所帮助。

url=requests.get('https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=TGT&apikey=RYFJGY3O92BUEVW4')
url_json = url.json() # This data is actually of dict type
for k,j in url_json['Time Series (Daily)'].items():
    print(k)
    for m, n in j.items(): # This data are a nested dictionary
        print('{} : {}'.format(m, n))

真正做到这一点,您可以编写一个函数,如果不是dict,则输出值,例如:

def print_values(dictionary):
    if isinstance(dictionary, dict):
        for k, v in dictionary.items():
            print(k)
            print_values(v)
    else:
        print(dictionary)

再见!

这可能只是我的风格,但我更喜欢这种方法:

for item in json_data['Time Series (Daily)']:
    open, high, low, close, volume = sorted(item).values()
    print('\n\t'.join([item.keys()[0], open, high, low, close, volume]))

这样,您已经在一行中将值分配给了开,高,低...,并且易于使用。

我还使它在一行代码中将所有值打印在换行符上(带有缩进) ,这比使用每个值的print()减少了代码意粉。 尽管这是有限的,但如果知道结构,它的使用将非常有效地进行调试。

我喜欢编写称为数据驱动的代码,因为这通常使以后更改变得更容易。

在这种情况下,可以这样做:

SERIES_KEY = 'Time Series (Daily)'
VALUE_KEYS = '1. open', '2. high', '3. low', '4. close', '5. volume'
longest_key = max(len(key) for key in VALUE_KEYS)

daily = json_data[SERIES_KEY]
for date, values in sorted(daily.items()):
    print(date)
    for key in VALUE_KEYS:
        print('  {:{width}} :  {}'.format(key, values[key], width=longest_key))
    print()

输出:

2018-11-19
  1. open   :  79.9300
  2. high   :  80.4000
  3. low    :  77.5607
  4. close  :  77.7900
  5. volume :  9126929

2018-11-20
  1. open   :  67.9900
  2. high   :  71.5000
  3. low    :  66.1500
  4. close  :  69.6800
  5. volume :  15573611

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM