Как разобрать файл JSON в список Python

#python #json #python-3.x

#python #json #python-3.x

Вопрос:

Я пытаюсь проанализировать файл JSON в Python, но не могу напечатать какие-либо конкретные данные, которые я пытаюсь извлечь из JSON.

Как я могу поместить эти данные JSON в отдельные массивы, чтобы я мог играть с ними в Python?

Это файл JSON:

 {
"Ask":
   {"0":[[9.13,30200],[9.14,106946],[9.15,53072],[9.16,58104],[9.17,45589]],
    "1":[[9.14,106946],[9.15,53072],[9.16,58104],[9.17,45589],[9.18,37521]] },

"Bid":
   {"0":[[9.12,198807],[9.11,1110],[9.1,42110],[9.09,84381],[9.08,98178]],
    "1":[[9.13,13500],[9.12,198807],[9.11,1110],[9.1,42110],[9.09,84381]]}
}
 

и это мой код:

 import json

with open("JSON Directory") as BOB:
    data=json.load(BOB)

for x in data["Bid"]:
    print(x["0"])

 

Я получаю эту ошибку:

 TypeError: string indices must be integers
 

Комментарии:

1. Я сделал это, извините, я не публиковал это, нет никаких проблем с чтением файла

2. @ 'r' YashPokar — это режим открытия файлов по умолчанию.

3. Я заставил Python успешно читать JSON, проблем с чтением файла нет. Проблема в том, что я не могу получить значения для ставки «0».

4. data['Bid'] дает вам словарь. Вам нужно посмотреть, как выполнить итерацию по словарю.

5. добавление «print x» в строку перед вашей ошибкой должно прояснить ваше понимание. Когда вы перебираете словарь, вы получаете ключ, а не значение.

Ответ №1:

Есть только небольшая проблема с вашим циклом for.

 james@VIII:~/Desktop$ ls
f.txt
james@VIII:~/Desktop$ cat f.txt 
{
"Ask":
   {"0":[[9.13,30200],[9.14,106946],[9.15,53072],[9.16,58104],[9.17,45589]],
    "1":[[9.14,106946],[9.15,53072],[9.16,58104],[9.17,45589],[9.18,37521]] },

"Bid":
   {"0":[[9.12,198807],[9.11,1110],[9.1,42110],[9.09,84381],[9.08,98178]],
    "1":[[9.13,13500],[9.12,198807],[9.11,1110],[9.1,42110],[9.09,84381]]}
}
james@VIII:~/Desktop$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> with open('f.txt') as f_in:
...     data = json.load(f_in)
... 
>>> data
{'Ask': {'0': [[9.13, 30200], [9.14, 106946], [9.15, 53072], [9.16, 58104], [9.17, 45589]], '1': [[9.14, 106946], [9.15, 53072], [9.16, 58104], [9.17, 45589], [9.18, 37521]]}, 'Bid': {'0': [[9.12, 198807], [9.11, 1110], [9.1, 42110], [9.09, 84381], [9.08, 98178]], '1': [[9.13, 13500], [9.12, 198807], [9.11, 1110], [9.1, 42110], [9.09, 84381]]}}
>>> data['Ask']
{'0': [[9.13, 30200], [9.14, 106946], [9.15, 53072], [9.16, 58104], [9.17, 45589]], '1': [[9.14, 106946], [9.15, 53072], [9.16, 58104], [9.17, 45589], [9.18, 37521]]}
>>> 
>>> data['Bid']
{'0': [[9.12, 198807], [9.11, 1110], [9.1, 42110], [9.09, 84381], [9.08, 98178]], '1': [[9.13, 13500], [9.12, 198807], [9.11, 1110], [9.1, 42110], [9.09, 84381]]}
>>> for x in data['Bid']['0']:
...     print(x)
... 
[9.12, 198807]
[9.11, 1110]
[9.1, 42110]
[9.09, 84381]
[9.08, 98178]
 

Ваш цикл for просто нужно было немного изменить.

PS вам не нужно указывать ‘r’ при чтении файла.

Вы также можете получить отдельные значения, подобные этому:

 >>> for x in data['Bid']['0']:
...     print(str(x[0])   ': '   str(x[1]))
... 
9.12: 198807
9.11: 1110
9.1: 42110
9.09: 84381
9.08: 98178
 

Комментарии:

1. Как я могу получить только 9.12, например? Я пытаюсь написать обобщенный код, чтобы получить, например, i:1to10 [‘Bid’][‘0’][i]-[‘Ask’][‘0’][i]

2. Это выглядит некрасиво, но здесь вы идете, хахаха: data[‘Bid’][‘0’][0][0] ( печатает 9.12)

Ответ №2:

ваш for — это цикл в ключах dict.

 for x in data["Bid"]:
  print(type(x))
# <class 'str'>
 

попробуйте:

 for x in data['Bid']['0']:
 print(x)
 

или

 for x in data['Bid'].values():
 print(x)
 

извините за мой английский 🙂

Ответ №3:

Значение data["Bid"] является dict, и путем итерации по dict с:

 for x in data["Bid"]:
 

на самом деле вы перебираете ключи dict, которые являются строками и не могут быть проиндексированы с помощью нецелого типа x["0"] .

Если вы намерены перебирать вложенные списки по 0 ключу data["Bid"] dict, вам следует вместо этого выполнить:

 for x in data["Bid"]['0']:
    print(x)
 

Комментарии:

1. strings and cannot be indexed with an integer like x["0"] в python строки фактически могут быть проиндексированы целым числом. Например, x[0] вернет результат вместо ошибки (хотя и не ожидаемый результат, но это отдельная проблема).

2. Упс, это действительно была опечатка. Исправлено.

3. Отлично ! Спасибо. Можете ли вы показать мне for пример для хранения этих 0 значений ставок в массиве

4. @JanisGustavian Вам не нужен for цикл для хранения data["Bid"]['0'] списка, потому что это уже список. Просто присвоите его переменной напрямую: lst = data["Bid"]['0']

5. Я понял вас, спасибо за ваш проницательный комментарий. Я пытаюсь выполнить некоторые вычисления, такие как i: от 1 до 10 данные [«Ставка»] [‘i’] Первый индекс -данные [«Спросить»] [‘i’] Первый индекс

Ответ №4:

Быстрый ответ (TL; DR)

  • Конвертировать перед
     for x in data["Bid"]:
      print(x["0"])
     
  • В после
     for x in data["Bid"]:
      print(data["Bid"][x])
     

Проблема

  • Ссылка на данные Python на загруженные данные JSON не дает желаемого результата

Решение

  • Правильно определите адрес JSON либо как ключ словаря, либо как строку
  • В исходном примере print(x["0"]) это неправильная ссылка, потому x что это строка (ключ словаря)
  • Это можно проверить, используя использование python pprint.pprint() для устранения неполадок, которые вы ищете

Пример

 ## import pprint 
## we use this to inspect the data to make sure we are
## working with what we expect

import pprint
pass

# [...] (loading code omitted)

for x in data["Bid"]:
  pprint.pprint(x)
# u'1'
# u'0'
 

Пример изменен

 ## pprint the values

for x in data.values():
  pprint.pprint(x)

# {u'0': [[9.13, 30200],
#         [9.14, 106946],
#         [9.15, 53072],
#         [9.16, 58104],
#         [9.17, 45589]],
#  u'1': [[9.14, 106946],
#         [9.15, 53072],
#         [9.16, 58104],
#         [9.17, 45589],
#         [9.18, 37521]]}
# {u'0': [[9.12, 198807],
#         [9.11, 1110],
#         [9.1, 42110],
#         [9.09, 84381],
#         [9.08, 98178]],
#  u'1': [[9.13, 13500],
#         [9.12, 198807],
#         [9.11, 1110],
#         [9.1, 42110],
#         [9.09, 84381]]}
 

Исправленный пример

 ## we are looking at dictionary keys with `x`
## if we want to iterate the dictionary keys in data["Bid"]
## we need to correctly reference what we are looking for

for x in data["Bid"]:
  print(data["Bid"][x])

# [[9.13, 13500], [9.12, 198807], [9.11, 1110], [9.1, 42110], [9.09, 84381]]
# [[9.12, 198807], [9.11, 1110], [9.1, 42110], [9.09, 84381], [9.08, 98178]]