Вступление
В этой статье мы будем анализировать, читать и записывать данные JSON в файл на Python.
За последние 5-10 лет формат JSON был одним из, если не самым, популярным способом сериализации данных. Особенно в мире веб-разработки вы, вероятно, столкнетесь с JSON через один из многих REST API , конфигурацию приложения или даже простое хранилище данных.
Учитывая его распространенность и влияние на программирование, на каком-то этапе разработки вы, вероятно, захотите научиться читать JSON из файла или записывать JSON в файл. Обе эти задачи довольно легко выполнить с помощью Python, как вы увидите в следующих нескольких разделах.
Запись JSON в файл
Самый простой способ записать ваши данные в формате JSON в файл с
помощью Python - использовать хранилище данных в dict
, который может
содержать другие вложенные dict
, массивы, логические значения или
другие примитивные типы, такие как целые числа и строки. Вы можете найти
более подробный список поддерживаемых типов данных
здесь
.
Встроенный пакет json
имеет волшебный код, который преобразует ваш dict
в сериализованную
строку JSON.
import json
data = {}
data['people'] = []
data['people'].append({
'name': 'Scott',
'website': 'stackabuse.com',
'from': 'Nebraska'
})
data['people'].append({
'name': 'Larry',
'website': 'google.com',
'from': 'Michigan'
})
data['people'].append({
'name': 'Tim',
'website': 'apple.com',
'from': 'Alabama'
})
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)
После импорта json
мы создаем несколько простых данных для записи в
наш файл. Важная часть приходит в конце, когда мы используем with
для
открытия нашего целевого файла, а затем используем
json.dump для
записи объекта data
в файл outfile
Любой файловый объект может быть передан второму аргументу, даже если это не настоящий файл. Хорошим примером этого может быть сокет, который можно открывать, закрывать и записывать во многом как файл. Поскольку 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, заполняет Python dict
данными и
возвращает их вам.
Как и json.dump
, json.load
имеет альтернативный метод, который
позволяет вам работать со строками напрямую, поскольку во многих случаях
у вас, вероятно, не будет файлового объекта, содержащего ваш JSON. Как
вы, наверное, догадались, это метод
json.loads .
Рассмотрим случай, когда вы вызываете конечную точку REST GET, которая
возвращает JSON. Эти данные поступают к вам в виде строки, которую вы
затем json.loads
напрямую передать в json.loads.
Параметры
При сериализации ваших данных в JSON с помощью Python результат будет в
стандартном формате и не очень удобочитаемым, так как пробелы удаляются.
Хотя это идеальное поведение для большинства случаев, иногда вам может
потребоваться внести небольшие изменения, например добавить пробелы,
чтобы сделать его удобочитаемым. И json.dump
и json.load
предоставляют несколько вариантов для большей гибкости, некоторые из
которых будут описаны здесь.
Довольно-полиграфический
Сделать JSON удобочитаемым (он же «красивая печать») так же просто, как
передать целочисленное значение для параметра indent
>>> import json
>>> data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
>>> json.dumps(data, indent=4)
{
"people": [
{
"website": "stackabuse.com",
"from": "Nebraska",
"name": "Scott"
}
]
}
На самом деле это очень полезно, поскольку вам часто придется читать
данные JSON во время разработки. Другой вариант - использовать
инструмент командной строки json.tool
. Итак, если вы просто хотите
красиво распечатать JSON в командной строке, вы можете сделать что-то
вроде этого:
$ echo '{"people":[{"name":"Scott", "website":"stackabuse.com", "from":"Nebraska"}]}' | python -m json.tool
{
"people": [
{
"name": "Scott",
"website": "stackabuse.com"
"from": "Nebraska",
}
]
}
Сортировка
В JSON объект определяется как:
Объект - это неупорядоченный набор пар имя / значение.
Итак, стандарт гласит, что порядок ключей не гарантируется, но возможно,
что он вам может понадобиться для ваших внутренних целей. Чтобы добиться
упорядочения, вы можете передать True
параметру sort_keys
при
использовании json.dump
или json.dumps
.
>>> import json
>>> data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
>>> json.dumps(data, sort_keys=True, indent=4)
{
"people": [
{
"from": "Nebraska",
"name": "Scott",
"website": "stackabuse.com"
}
]
}
Текст ASCII
По умолчанию json.dump
гарантирует, что весь ваш текст в данном
словаре Python имеет кодировку ASCII. Если присутствуют символы,
отличные от ASCII, они автоматически экранируются, как показано в
следующем примере:
>>> import json
>>> data = {'item': 'Beer', 'cost':'£4.00'}
>>> jstr = json.dumps(data, indent=4)
>>> print(jstr)
{
"item": "Beer",
"cost": "\u00a34.00"
}
Это не всегда приемлемо, и во многих случаях вы можете не трогать
символы Unicode. Для этого установите для параметра ensure_ascii
False
.
>>> jstr = json.dumps(data, ensure_ascii=False, indent=4)
>>> print(jstr)
{
"item": "Beer",
"cost": "£4.00"
}
Заключение
В этой статье мы познакомили вас с json.dump
, json.dumps
,
json.load
и json.loads
, которые помогают в сериализации и
десериализации строк JSON.
Поскольку JSON стал одним из самых популярных способов сериализации
структурированных данных, вам, вероятно, придется довольно часто
взаимодействовать с ним, особенно при работе с веб-приложениями. Модуль
Python json
- отличный способ начать работу, хотя вы, вероятно,
обнаружите, что simplejson -
еще одна отличная альтернатива, гораздо менее строгая в отношении
синтаксиса JSON (который мы сохраним для другой статьи).
Каковы ваши общие сценарии использования для хранения данных JSON? Сохранение данных, конфигурация или что-то еще? Дайте нам знать об этом в комментариях!