Чтение и запись JSON в файл в Python

Введение В этой статье мы будем анализировать, читать и записывать данные JSON в файл на Python. За последние 5-10 лет формат JSON [https://en.wikipedia.org/wiki/JSON] был одним из, если не самым, популярным способом сериализации данных. Особенно в мире веб-разработки вы, вероятно, столкнетесь с JSON через один из многих REST API [https://en.wikipedia.org/wiki/Representational_state_transfer], конфигурацию приложения или даже простое хранилище данных. Учитывая его распространенность и им

Вступление

В этой статье мы будем анализировать, читать и записывать данные 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? Сохранение данных, конфигурация или что-то еще? Дайте нам знать об этом в комментариях!

comments powered by Disqus

Содержание