Как перебирать значения в данных JSON?

У меня есть 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 здесь.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
830
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я взял 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()
Ответ принят как подходящий

Вы можете добиться этого, рассматривая его как словарь. Попробуйте сделать следующее в качестве цикла, и вы сможете извлечь желаемые результаты:

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
-------------

Красиво, сработало именно так, как я хотел. Какая польза от функции .item?

RoXeno 21.11.2018 02:50

@ R.Vij Он превращает словарь в список кортежей, что делает его легко повторяемым и позволяет нам очень легко разделять на ключи и значения. Рад, что смог помочь!

PL200 21.11.2018 02:53

Возможно, это просто мой стиль, но я предпочитаю такой подход:

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() для каждого значения. Хотя это ограничено в использовании, но довольно эффективно для отладки, если вы знаете структуру.

Я получаю неожиданный EOF во время синтаксического анализа. Почему?

RoXeno 21.11.2018 02:48

Мне нравится писать код, который называется управляемый данными, потому что это часто упрощает внесение изменений в дальнейшем.

Вот как это можно сделать в данной ситуации:

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

Хай, ну, основная тема здесь не сам 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)

До встречи!

Другие вопросы по теме