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