Рубрики
Без рубрики

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

В этом уроке вы узнаете, как анализировать, читать и записывать JSON в файлы на Python с помощью примеров, используя методы загрузки и дампа. Мы также рассмотрим красивую печать и сортировку.

Автор оригинала: Scott Robinson.

Вступление

В этой статье мы будем анализировать, читать и записывать данные JSON в файл на Python.

За последние 5-10 лет формат JSON стал одним из, если не самым популярным, способов сериализации данных. Особенно в мире веб-разработки вы, скорее всего , столкнетесь с JSON через один из многих REST API , конфигурацию приложений или даже простое хранилище данных.

Учитывая его распространенность и влияние на программирование, в какой-то момент вашего развития вы, вероятно, захотите научиться читать JSON из файла или записывать JSON в файл. Обе эти задачи довольно легко выполнить с помощью Python, как вы увидите в следующих нескольких разделах.

Запись JSON в файл

Самый простой способ записать ваши данные в формате JSON в файл с помощью Python-это использовать хранение ваших данных в объекте dict , который может содержать другие вложенные dict s, массивы, логические значения или другие примитивные типы, такие как целые числа и строки. Более подробный список поддерживаемых типов данных можно найти здесь .

Встроенный пакет json содержит волшебный код, который преобразует ваш объект Python 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 непосредственно из объекта file. В следующем примере мы делаем именно это, а затем распечатываем полученные данные:

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('')

джсон.load – это важный метод, который следует отметить здесь. Он считывает строку из файла, анализирует данные JSON, заполняет Python dict данными и возвращает их вам.

Точно так же, как json.dump , json.load имеет альтернативный метод, который позволяет вам работать со строками напрямую, так как во многих случаях у вас, вероятно, не будет файлоподобного объекта, содержащего ваш JSON. Как вы, наверное, догадались, этот метод называется json.loads . Рассмотрим случай, когда вы вызываете конечную точку REST GET, которая возвращает JSON. Эти данные поступают к вам в виде строки, которую вы затем можете передать непосредственно в json.loads .

Опции

При сериализации ваших данных в JSON с помощью Python результат будет в стандартном формате и не очень читабелен, так как пробелы исключены. Хотя это идеальное поведение для большинства случаев, иногда вам может потребоваться внести небольшие изменения, например добавить пробелы, чтобы сделать его читаемым человеком. Оба json.dump и json.load предоставляет довольно много вариантов для большей гибкости, некоторые из которых будут описаны здесь.

Pretty-Printing

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