Модуль json

JSON (JavaScript Object Notation) — простой формат обмена данными, основанный на подмножестве синтаксиса JavaScript. Модуль json позволяет кодировать и декодировать данные в удобном формате.
Кодирование основных объектов Python:
Декодирование (парсинг) JSON:
]'] json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) - сериализует obj как форматированный JSON поток в fp.
Если skipkeys = True, то ключи словаря не базового типа (str, unicode, int, long, float, bool, None) будут проигнорированы, вместо того, чтобы вызывать исключение TypeError.
Если ensure_ascii = True, все не-ASCII символы в выводе будут экранированы последовательностями \uXXXX, и результатом будет строка, содержащая только ASCII символы. Если ensure_ascii = False, строки запишутся как есть.
Если check_circular = False, то проверка циклических ссылок будет пропущена, а такие ссылки будут вызывать OverflowError.
Если allow_nan = False, при попытке сериализовать значение с запятой, выходящее за допустимые пределы, будет вызываться ValueError (nan, inf, -inf) в строгом соответствии со спецификацией JSON, вместо того, чтобы использовать эквиваленты из JavaScript (NaN, Infinity, -Infinity).
Если indent является неотрицательным числом, то массивы и объекты в JSON будут выводиться с этим уровнем отступа. Если уровень отступа 0, отрицательный или "", то вместо этого будут просто использоваться новые строки. Значение по умолчанию None отражает наиболее компактное представление. Если indent - строка, то она и будет использоваться в качестве отступа.
Если sort_keys = True, то ключи выводимого словаря будут отсортированы.
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) - сериализует obj в строку JSON-формата.
Аргументы имеют то же значение, что и для dump().
Ключи в парах ключ/значение в JSON всегда являются строками. Когда словарь конвертируется в JSON, все ключи словаря преобразовываются в строки. В результате этого, если словарь сначала преобразовать в JSON, а потом обратно в словарь, то можно не получить словарь, идентичный исходному. Другими словами, loads(dumps(x)) != x, если x имеет нестроковые ключи.
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) - десериализует JSON из fp.
object_hook - опциональная функция, которая применяется к результату декодирования объекта (dict). Использоваться будет значение, возвращаемое этой функцией, а не полученный словарь.
object_pairs_hook - опциональная функция, которая применяется к результату декодирования объекта с определённой последовательностью пар ключ/значение. Будет использован результат, возвращаемый функцией, вместо исходного словаря. Если задан так же object_hook, то приоритет отдаётся object_pairs_hook.
parse_float, если определён, будет вызван для каждого значения JSON с плавающей точкой. По умолчанию, это эквивалентно float(num_str).
parse_int, если определён, будет вызван для строки JSON с числовым значением. По умолчанию эквивалентно int(num_str).
parse_constant, если определён, будет вызван для следующих строк: "-Infinity", "Infinity", "NaN". Может быть использовано для возбуждения исключений при обнаружении ошибочных чисел JSON.
Если не удастся десериализовать JSON, будет возбуждено исключение ValueError.
json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) - десериализует s (экземпляр str, содержащий документ JSON) в объект Python.
Остальные аргументы аналогичны аргументам в load().
Кодировщики и декодировщики
Класс json.JSONDecoder(object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None) - простой декодер JSON.
Выполняет следующие преобразования при декодировании:
JSON
Python
object
dict
array
list
string
str
number (int)
int
number (real)
float
true
True
false
False
null
None
Он также понимает NaN, Infinity, и -Infinity как соответствующие значения float, которые находятся за пределами спецификации JSON.
Класс json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
Расширяемый кодировщик JSON для структур данных Python. Поддерживает следующие объекты и типы данных по умолчанию:
Python
JSON
dict
object
list, tuple
array
str
string
int, float
number
True
true
False
false
None
null
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Работа с JSON-файлами в Python
Бывает такое, что при открытии файлов в них оказываются данные, очень похожие на словари и списки. Или наоборот, вы хотите записать в файл словарь, но не знаете как это сделать. На помощь приходит стандартный модуль json .
JSON — текстовый формат данных, очень похожий на словари и списки. Изначально он пришёл из JavaScript, но сейчас используется повсеместно. Хоть данные и похожи на словари и списки, в файл записан обычный текст. Чтобы превратить его в словари и списки нужна библиотека json .
Прочитать JSON
Пусть есть файл capitals.json с очень похожим на словарь содержимым:
"Россия": "Москва", "Беларусь": "Минск", "Казахстан": "Нур-Султан" >
Простое открытие этого файла выглядит так:
with open("capitals.json", "r") as my_file: capitals = my_file.read()
Проблема в том, что в capitals будет лежать не словарь, а строка. Если попытаться достать значение по ключу, то случится ошибка:
print(capitals["Россия"]) Traceback (most recent call last): File "", line 1, in module> TypeError: string indices must be integers
Чтобы превратить строку в словарь понадобится модуль json . Его не нужно дополнительно устанавливать, он входит в стандартный набор библиотек:
import json with open("capitals.json", "r") as my_file: capitals_json = my_file.read() capitals = json.loads(capitals_json)
Функция json.loads взяла строку capitals_json и на основе её данных сделала словарь. Теперь в capitals лежит не строка, а словарь:
print(capitals["Россия"]) # Москва
«Девман» — авторская методика обучения программированию на Python. Готовим к работе крутых программистов.
Запись в файл
Если же вам нужно сохранить в файл словарь или список, то это тоже можно легко сделать, по аналогии. Сначала из словаря сделаем строку, затем сохраним её в файл:
import json capitals = "Россия": "Москва", "Беларусь": "Минск", "Казахстан": "Нур-Султан" > capitals_json = json.dumps(capitals) with open("capitals.json", "w") as my_file: my_file.write(capitals_json)
Читайте дальше
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Как в Python сохранять информацию в журнал
Про форматы, немного о журналировании и пример кода на Python
Денис Расулев · Dec 24, 2021 ·

Photo by Chris Ried on Unsplash
Допустим, что тебе нужно сохранить некоторую информацию о каком-либо событии и времени, когда оно случилось в файл журнала. Одним из самых подходящих для этого форматов файла является JSON.
Что такое JSON
JSON (JavaScript Object Notation) - это легкий формат, который используется повсеместно для обмена данными. Он основан на подмножестве языка JavaScript (способ построения объектов в JavaScript). Как отмечено в MDN, некоторые JavaScript не являются JSON, а некоторые JSON не являются JavaScript.
Примером того, где такой формат используется очень широко, являются ответы веб сервисов. В “старые” времена веб сервисы использовали XML в качестве основного формата для передачи данных, но с тех пор, как появился JSON (формат JSON определен в RFC 4627 Дугласа Крокфорда), этот формат стал предпочтительным, поскольку он гораздо более легкий.
Вы можете найти много дополнительной информации на официальном сайте JSON и в этом отличном ответе на StackOverflow.
Функция журналирования
Вот пример функции для сохранения информации в журнал на Python. Мы будем вызывать ее в момент события, и она будет сохранять всю необходимую информацию в журнал.
1 2 3 4 5 6 7 8 9 10
def write_to_log(file_object, event_name, description, value): """Write message to a log file""" event_time = str(datetime.datetime.now()) data = OrderedDict() data['time'] = event_time data['event'] = event_name data['details'] = description data['value'] = value json.dump(data, file_object, separators=(', ', ':')) file_object.write('\n')
Пример использования
Сначала нам нужно открыть файл журнала для добавления в него информации. Мы будем использовать режим дополнения журнала и для этого используем флажок “a” - append.
LOG = open("log.txt", "a", encoding='utf-8')
Затем мы записываем информацию о событии в журнал:
1 2 3 4 5
for i in range(5): EVENT_NAME = 'EVENT_' + str(i) WHAT_HAPPENED = 'HAPPENED_' + str(i) SOME_VALUE = i write_to_log(LOG, EVENT_NAME, WHAT_HAPPENED, SOME_VALUE)
Это создаст красиво отформатированный файл журнала:
1 2 3 4 5
"time":"2019-11-03 13:38:56.822216", "event":"EVENT_0", "details":"HAPPENED_0", "value":0> "time":"2019-11-03 13:38:56.822317", "event":"EVENT_1", "details":"HAPPENED_1", "value":1> "time":"2019-11-03 13:38:56.822369", "event":"EVENT_2", "details":"HAPPENED_2", "value":2> "time":"2019-11-03 13:38:56.822410", "event":"EVENT_3", "details":"HAPPENED_3", "value":3> "time":"2019-11-03 13:38:56.822449", "event":"EVENT_4", "details":"HAPPENED_4", "value":4>
Надеюсь, тебе это поможет.
Чтение и запись в файл JSON-объекта
Эта статья научит вас парсить данные из JSON. Также вы узнаете, как читать и записывать в файл данные JSON.
За последние 5-10 лет формат JSON был одним из самых популярных способов сериализации данных (если не самым популярным). Особенно в веб-разработке. С этим форматом вы столкнетесь при работе с REST API, конфигурациями приложений или базами данных.
Несомненно, знать принципы работы JSON — очень важно. В какой-то момент вы обязательно с ним встретитесь. Возможно, вы захотите узнать, как читать и записывать JSON в файл. Все эти действия — очень простые. В этом вы убедитесь, разобрав следующие примеры.
Запись JSON в файл
Самый простой способ записать JSON в файл — использовать словарь. Они могут хранить вложенные словари, массивы, булевы значения и другие типы данных вроде целых чисел и строк. Более детальный список поддерживаемых типов данных можно найти здесь.
Во встроенной библиотеке json есть «волшебный» метод, который позволяет конвертировать словари в сериализованную JSON-строку.
import json data = <> data['people'] = [] data['people'].append(< 'name': 'Scott', 'website': 'pythonist.ru', 'from': 'Nebraska' >) data['people'].append(< 'name': 'Larry', 'website': 'pythonist.ru', 'from': 'Michigan' >) data['people'].append(< 'name': 'Tim', 'website': 'pythonist.ru', 'from': 'Alabama' >) with open('data.txt', 'w') as outfile: json.dump(data, outfile)
После импорта библиотеки json мы объявляем несколько словарей и наполняем их данными. Самая важная часть — в конце программы. Здесь мы используем оператор with , чтобы открыть файл. После этого мы используем метод json.dump , чтобы записать наши словари в файл.
Вторым аргументом может быть любой файлоподобный объект — даже если это не совсем файл. Например, сокет. Его можно открыть, закрыть и записать так же, как и файл. С подобным вариантом использования JSON вы точно столкнетесь — это важно запомнить.
Стоит упомянуть и о вариации метода json.dump — json.dumps . Этот метод позволяет вернуть JSON-строку, а не записывать ее в файл. Это может быть полезно, если вы хотите изменить JSON-строку. (например, зашифровать)
Чтение JSON из файла
Чтение JSON из файла такое же простое, как и запись. С помощью библиотеки json мы можем спарсить JSON-строку прямо из файла. В этом примере мы парсим данные и выводим их в консоль:
import json with open('data.txt') as json_file: data = json.load(json_file) for p in data['people']: print('Name: ' + p['name']) print('Website: ' + p['website']) print('From: ' + p['from']) print('')
json.load — очень важный метод, запомните его. С его помощью происходит чтение файла, парс JSON-данных. После этого все данные записываются в словарь и возвращаются вам.
Как и у json.dump , у json.load есть дополнительный метод. Он позволяет работать со строками напрямую, ведь чаще всего у вас не будет файлоподобного объекта, содержащего JSON. Как вы уже догадались, называется он json.loads . Допустим, вы вызываете конечную точку REST с помощью GET, который возвращает строку. Ее мы и можем напрямую передать в json.loads .
Параметры
При сериализации данных в JSON могут возникнуть проблемы. Например, его будет не очень удобно читать, ведь удаляются все пробелы. В большинстве случаев этот вариант вполне хорош, но порой нужно внести небольшие изменения. К примеру, добавить пробелы, чтобы JSON было удобнее читать. У json.load и json.dump есть несколько параметров, которые дают необходимую гибкость. О некоторых из них мы и поговорим.
Pretty-Printing
Сделать JSON более удобочитаемым (pretty-printing) — очень просто. Нужно лишь передать целое число в параметр indent :
import json data = <'people':[<'name': 'Scott', 'website': 'pythonist.ru', 'from': 'Nebraska'>]> json.dumps(data, indent=4) < "people": [ < "website": "pythonist.ru", "from": "Nebraska", "name": "Scott" >] >
Это довольно полезно. Особенно если вам часто приходится читать JSON во время работы. Также вы можете использовать использовать команду json.tool прямо в командной строке. Если вы хотите удобочитаемый JSON, наберите в командной строке следующий код:
$ echo '<"people":[<"name":"Scott", "website":"pythonist.ru", "from":"Nebraska">]>' | python -m json.tool < "people": [ < "name": "Scott", "website": "pythonist.ru" "from": "Nebraska", >] >
Сортировка
В JSON объект определяется следующим образом:
Объект — это неупорядоченный набор пар ключ/значение.
То есть, порядок не гарантируется. Но навести его реально. Сделать это можно с помощью передачи True в параметр sort_keys в методах json.dump или json.dumps .
import json data = <'people':[<'name': 'Scott', 'website': 'pythonist.ru', 'from': 'Nebraska'>]> json.dumps(data, sort_keys=True, indent=4) < "people": [ < "from": "Nebraska", "name": "Scott", "website": "pythonist.ru" >] >
ASCII-текст
По умолчанию json.dump проверяет, имеет ли ваш текст в словаре кодировку ASCII. Если присутствуют символы, отличные от ASCII, они автоматически экранируются. Это показано в следующем примере:
import json data = jstr = json.dumps(data, indent=4) print(jstr)
Но это не всегда приемлемо. Во многих случаях вы бы хотели сохранить символы Unicode нетронутыми. Для этого нужно передать в параметр ensure_ascii значение False .
jstr = json.dumps(data, ensure_ascii=False, indent=4) print(jstr)