![]() |
Обработка JSON в языке Python |
![]() |
Словари в Python
Словарём (или ассоциативным массивом, англ. dictionary) называется
структура данных, предназначенная для хранения информации в виде пар
(ключ, значение)
. Если провести аналогию с массивами, то ключ словаря играет
ту же роль, что и индекс массива - имея ключ, можно получить соответствующее ему
значение. В отличие от массива, ключи словаря могут иметь произвольные типы,
например строки или те же словари. Словари являются популярной структурой данных
для хранения сопоставления между идентификаторами каких-либо объектов и подробной
информации об этих объектах.
В Python словарь является встроенным типом данных - для его использования не требуется подключать никаких сторонних библиотек, а для его создания существует специальный синтаксис.
# создание пустого словаря
= {}
my_dict # другой способ
= dict()
my_dict
# добавление элемента в словарь
# ключом является строковая константа "Волгоград", а значением - число 1000000
"Волгоград"] = 1000000
my_dict[
# доступ к элементу по ключу и вывод на экран
# выведет 1000000
print(my_dict["Волгоград"])
При попытке доступа к элементу с ключом, который отсутствует в словаре, возникнет
исключение. Чтобы этого не случилось, можно использовать метод .get()
,
возвращающий указанное значение по умолчанию, если запрашиваемый ключ отсутствует:
= {}
my_dict
# вызовет исключение
print(my_dict["blabla"])
# выведет 123
print(my_dict.get("blabla", 123))
Для создания словарей можно использовать специальный синтаксис:
# d1 и d2 в коде ниже эквивалентны
= {
d1 True: 1,
False: 0
}
= {}
d2 True] = 1
d2[False] = 0 d2[
В словаре не может быть двух значений с одинаковыми ключами:
= {
d1 'a': 11,
'b': 22,
'b': 33,
'c': 44
}
# выведет 33
print(d1['b'])
Организовывать циклы по словарям можно несколькими способами: по ключам, по
значениям, или по парам (ключ, значение)
:
= {
d1 'a': 11,
'b': 22,
'b': 33,
'c': 44
}
for k in d1.keys():
print(k) # выведет буквы
for v in d1.values():
print(v) # выведет числа
for t in d1.items():
print(t) # выведет пары
Формат JSON
JSON (JavaScript Object Notation) - текстовый формат для хранения и
передачи данных в виде пар (ключ, значение)
. Первоначально являлся частью
языка JavaScript и применялся для передачи информации между веб-сайтом и
браузером пользователя. На сегодняшний день JSON является популярным способом
сериализации данных и используется в различных протоколах и языках программирования.
Синтаксическая структура JSON очень напоминает синтаксис Python для объявления словарей. В отличие от Python, ключи в JSON могут быть только строками, а булевы константы записываются с маленькой буквы.
Объект JSON обрамляется символами {
и }
и состоит из произвольного числа
полей. Каждое поле имеет вид ключ: значение
, где ключ
- произвольная строка.
Значениями в JSON являются:
- Целые числа и числа с плавающей точкой (
1
,-1
,1.0
); - Строки (
"asdfg"
); - Массивы значений (
[123, 456]
); - Булевы значения (
true
,false
); - Другие объекты JSON (
{ ... }
); - Значение
null
.
Приведём пример JSON-объекта, описывающего химический элемент:
{
"Название": "Кислород",
"АтомнаяМасса": 15.99903,
"ТермодинамическаяФаза": "Газ",
"СтепениОкисления": ["–2", "−1", "–0.5", "-0.333", "0", "+0.5", "+1", "+2"],
"ПростоеВещество": true
}
Обратка JSON-информации в Python
Для работы с JSON в языке Python необходим одноимённый модуль:
import json
Этот модуль предоставляет функции, позволяющие конвертировать текстовое представление JSON-объектов в словари Python и наоборот. Таким образом, обработка JSON в Python сводится к следующим шагам:
- Построение словаря из входного JSON-файла или строки.
- Работа со словарём, как с обычным значением Python.
- Генерация JSON-объекта из обработанного словаря в строковую переменную или в выходной файл.
Рассмотрим пример, реализующий эти шаги:
# построение словаря из JSON-строки:
str = '''
{
"Название": "Кислород",
"АтомнаяМасса": 15.99903,
"ТермодинамическаяФаза": "Газ",
"СтепениОкисления": ["–2", "−1", "–0.5", "-0.333", "0", "+0.5", "+1", "+2"],
"ПростоеВещество": true
}
'''
= json.loads(str)
d1 # построение словаря из файла с JSON-объектом
= json.load(open("file.json"))
d2
# работа со словарём: изменим степень окисления
"СтепениОкисления"].remove("0")
d1[
# генерация JSON в виде строки
print(json.dumps(d1))
# генерация JSON в выходной файл
open("file2.json", "w")) json.dump(d1,
Функции load
и loads
принимают следующие необязательные именованные параметры:
object_hook
. Функция, которая будет вызвана над полученным словарём. Результат этой функции будет возвращён изload
/loads
. Значение по умолчанию -dict
.object_pairs_hook
. Аналогиченobject_hook
, но функция, переданная в этот аргумент, принимает список пар, вместо словаря. Имеет приоритет передobject_hook
.parse_float
. Функция, которая будет вызываться для преобразования чисел с плавающей точкой, извлечённых их строкового представления JSON. Значение по умолчанию -float
.parse_int
. Аналогиченparse_float
, но функция, переданная в этот аргумент, вызывается для целочисленных констант. Значение по умолчанию -int
.parse_constant
. Аналогиченparse_float
, но функция, переданная в этот аргумент, вызывается для констант-Infinity
,Infinity
иNaN
.
Функции dump
и dumps
принимают следующие необязательные именованные параметры:
ensure_ascii
. Определяет, нужно ли экранировать символы, не входящие в кодировку ASCII. Чтобы в выводимом JSON отображался русский текст, этот параметр должен быть установлен вFalse
. Значение по умолчанию -True
.skipkeys
. Определяет, нужно ли пропускать те ключи словаря, тип которых не является булевым, численным или строковым. Значение по умолчанию -False
.check_circular
. Определяет, должен ли Python определять циклические конструкции в обрабатываемом словаре. Значение по умолчанию -True
.allow_nan
. Определяет, допустимо ли обрабатывать значения-inf
,inf
иnan
, если они встречаются в словаре. Значение по умолчанию -True
.indent
. Определяет, нужно ли форматировать вывод элементов списков. Если в качестве значения этого аргумента передано неотрицательное число, то каждый элемент списка располагается на новой строке с отступом равным этому числу. Если в качестве значения передана строка (например,"\t"
), то эта строка приписывается перед каждым элементом. Значение по умолчанию -None
.sort_keys
. Определяет, нужно ли сортировать ключи в алфавитном порядке в выходном JSON. Значение по умолчанию -False
.
Контрольные вопросы
- Может ли в словаре находиться единственный элемент с ключом
4
? - Каким образом нужно вызвать функцию
loads
, чтобы в полученном словаре все числа с плавающей точкой оказались округлёнными до целых? - В какой ситуации может понадобиться передать
skipkeys=True
в вызовdump
/dumps
? - В чём может быть причина того, что параметр
sort_keys
равенFalse
по умолчанию?
Задание на лабораторную работу
Написать программу, обрабатывающую JSON-файл в соответствии с вариантом. Пользователь может искать записи, удовлетворяющие определённому критерию, а так же вносить новые записи в файл.
Варианты заданий
Вариант 1
- Файл var1.json.
- Пользователь может искать все книги, написанные указанным автором.
- Пользователь может запросить суммарное количество страниц всех хранимых книг.
- Пользователь может добавлять новых авторов.
Вариант 2
- Файл var2.json.
- Пользователь может искать все направления обучения для указанного уровня подготовки.
- Пользователь может запросить список студентов для заданной группы.
- Пользователь может добавлять новых студентов.
Вариант 3
- Файл var3.json.
- Пользователь может искать монстров заданного уровня.
- Пользователь может запросить список вещей, которые можно добыть с указанного монстра.
- Пользователь может добавлять новые вещи.
Вариант 4
- Файл var4.json.
- Пользователь может искать программные продукты для заданной платформы.
- Пользователь может запрашивать разработчика данного программного продукта.
- Пользователь может добавлять новые компании.
Вариант 5
- Файл var5.json.
- Пользователь может запрашивать список сотрудников с зарплатой, меньшей указанной.
- Пользователь может искать сотрудников, принадлежащих заданному подразделению.
- Пользователь может добавлять новые подразделения.
Вариант 6
- Файл var6.json.
- Пользователь может запрашивать список военнослужащих с указанной специализацией.
- Пользователь может запрашивать название военной части для данного военнослужащего.
- Пользователь может добавлять новые военные части.
Вариант 7
- Файл var7.json.
- Пользователь может запрашивать список планет с массой, меньше указанной.
- Пользователь может запрашивать название солнечной системы для данной планеты.
- Пользователь может добавлять новые звёздные системы.
Вариант 8
- Файл var8.json.
- Пользователь может запрашивать имя художника для заданной картины.
- Пользователь может запрашивать список картин, работа над которыми велась в указанный год.
- Пользователь может добавлять новых художников.
Вариант 9
- Файл var9.json.
- Пользователь может запрашивать список публикаций для заданного журнала.
- Пользователь может запрашивать список журналов, в которых печатался указанный автор.
- Пользователь может добавлять новые журналы.
Вариант 10
- Файл var10.json.
- Пользователь может запрашивать список дисциплин, которые ведёт данный преподаватель.
- Пользователь может запрашивать список преподавателей, которые ведут предметы в указанном семестре.
- Пользователь может добавлять новых преподавателей.
Вариант 11
- Файл var11.json.
- Пользователь может запрашивать список реализаций данного языка.
- Пользователь может запрашивать список языков программирования заданного типа (интерпретируемые, компилируемые).
- Пользователь может добавлять новые языки программирования.
Вариант 12
- Файл var12.json.
- Пользователь может запрашивать список заказов данного клиента.
- Пользователь может запрашивать список клиентов, с суммой всех заказов большей заданной.
- Пользователь может добавлять новых клиентов.
Вариант 13
- Файл var13.json.
- Пользователь может запрашивать список медицинских организаций, в которых имеются врачи заданной специализации.
- Пользователь может запрашивать список врачей, работающих в указанной медицинской организации.
- Пользователь может добавлять новые медицинские организации.
Вариант 14
- Файл var14.json.
- Пользователь может запрашивать список производителей, устанавливающих указанную операционную систему на свои смартфоны.
- Пользователь может запрашивать список смартфонов, имеющих заданный процессор.
- Пользователь может добавлять новые компании-производители.
Вариант 15
- Файл var15.json.
- Пользователь может запрашивать список собственников, имеющих в своём распоряжении объекты с площадью более заданной.
- Пользователь может запрашивать список объектов недвижимости, принадлежащих заданному собственнику.
- Пользователь может добавлять новых собственников.
