Python: Json.load выдает список и не может проанализировать данные из него - PullRequest
1 голос
/ 20 марта 2019

У меня есть файл data.json, который выглядит следующим образом:

["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]

Я пытаюсь получить «Событие» из этого файла, используя python, и терпит неудачу при этом.

with open('data.json', 'r') as json_file:
    data = json.load(json_file)
    print (data['Event'])

Я получаю следующую ошибку:

TypeError: индексы списка должны быть целыми или кусочками, а не str

И даже когда я пытаюсь

print (data[0]['Event'])

тогда я получаю эту ошибку:

TypeError: строковые индексы должны быть целыми числами

Еще одна вещь:

print(type(data))

дает мне "список"

Я искал все и не нашел решения для этого. Буду очень признателен за ваши предложения.

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Вы можете использовать модуль ast для этого:

import ast

mydata = ["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]
data = ast.literal_eval(mydata[0])
data
{'Day': 'Today', 'Event': '1', 'Date': '2019-03-20'}

data['Event']
'1'

Редактировать

Ваш исходный код загружает данные в структуру списка, но содержит только одну строковую запись внутри этого списка, несмотря на правильный синтаксис json. ast, как и json, проанализирует эту строковую запись в структуре данных Python, dict.

Когда вы пытаетесь проиндексировать этот список, это не то же самое, что вызов ключа в dict, поэтому slices cannot be str:

alist = [{'a':1, 'b':2, 'c':3}]
alist['a']
TypeError

# need to grab the dict entry from the list
adict = alist[0]
adict['a']
1
1 голос
/ 20 марта 2019

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

["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]

Посмотрите, как все содержимое списка окружено " с обеих сторон, а каждому другому " предшествует \?Косая черта обычно означает игнорирование специального значения, которое может иметь следующий символ, но интерпретировать его как чисто строку.

Если у вас есть контроль над содержимым файла, самое простое решение - это настроить его.Вы захотите, чтобы он был в таком формате:

[{"Day":"Today", "Event": "1", "Date": "2019-03-20"}]

Редактировать: Как уже предлагали другие, вы также можете проанализировать его в его текущем состоянии.Конечно, очистка данных утомительна, но часто стоит усилий.Хотя это не может быть одним из таких случаев.Я все равно оставляю этот ответ, потому что он может помочь объяснить, почему первоначальная попытка OP не сработала, и почему он получил полученные сообщения об ошибках.

1 голос
/ 20 марта 2019

Вам необходимо преобразовать элементы данных в dict, используя модуль json.

Пример:

import json

with open(filename) as infile:
    data = json.load(infile)
for d in data:
    print(json.loads(d)['Event'])

Или:

data = list(map(json.loads, data))
print(data[0]["Event"])

Выход:

1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...