Функции json. Сохранение данных Python
Большинство программ запрашивают у пользователей информацию, например вводят личные данные, настройки игры и т.д. Когда пользователь закрывает программу или покидает ваше приложение, введенные данные лучше сохранить, чтобы пользователь не вводил их при каждом посещение. Простейший способ сохранения данных основан на использовании модуля json .
Содержание страницы: |
---|
1. Функции json.dump() и json.load() |
2. Сохранение и чтение данных, сгенерированных пользователем |
1. Функции json.dump() и json.load() в Python
Модуль json обеспечивает запись простых данных Python в файл и загружает данные из файла при следующем запуске программы. Формат данных json не привязан к Python, поэтому данные в этом формате могут передаваться программам, написанные на других языках программирования. Формат JSON(JavaScript Object Notation) был разработан для JavaScript, а после стал использоваться во многих языках программирования. Модуль json может использоваться для обмена данными между программами.
Приведем пример простой программы, которая сохраняет список чисел в память с помощью функции json.dump() и вторую программу, которая читает этот список c помощью функции json.load() обратно в память.
filename = ‘numbers.json’
with open (filename, ‘w’) as f :
json.dump (numbers, f )
В начале импортируем модуль json . Затем создаем список numbers. В переменной filename присваиваем название файла, в которым будем сохранять список. Обычно для таких файлов принято использовать расширение .json , указывающее что данные хранятся в формате JSON. Затем файл открывается в режиме записи ‘ w ‘. В конце функция json.dump() сохраняет список numbers в файле ‘numbers.json’.
Данная программа ничего не выводит, но если открыть папку, в которой написана программа, то там появится файл numbers.json, внутри которого хранится наш список.
Теперь напишем вторую программу, которая читает список обратно в память с помощью функции json.load().
filename = ‘numbers.json’
with open (filename) as f :
numbers = json.load ( f )
print(numbers)
В начале импортируем модуль json . В переменной filename используем тот же файл, в который ранее были записаны данные ‘numbers.json’. Далее файл открываем в режиме чтения. Данные с помощью функции json.load() загружаются и сохраняются в переменную numbers и с помощью функции print выводятся на экран:
Модуль json позволяет организовать простейший обмен данными между программами.
2. Сохранение и чтение данных, сгенерированных пользователем на Python
При работе с данными, сгенерированными пользователем, можно использовать модуль json . Без сохранения информация о пользователе будет потеряна при остановке программы. Приведем пример программы, которая запрашивает у пользователя имя при первом запуске и выводит его при последующих запусках программы:
filename = ‘name.json’
with open (filename, ‘w’) as f :
json.dump (numbers, f )
print(f»Добро пожаловать на сайт !»)
В начале программа запрашивает имя пользователя с помощью функции input и сохраняет имя в переменной name. Далее открываем файл, находящийся в переменной filename в режиме записи ‘ w ‘ и с помощью функции json.dump() сохраняем имя пользователя в файле. Запустив эту программу, мы получим:
Введите ваше имя: Артур
Добро пожаловать на сайт Артур!
Теперь приведем пример программы, которая приветствует пользователя уже известного ей и сохраненного в файле:
with open (filename) as f :
name = json.load ( f )
print(f»С возвращением !»)
Программа читает информация из файла ‘name.json’ и сохраняет в переменную name. После этого программы выводит приветствие на экран:
С возвращением Артур!
Теперь эти две программы можно объединить в одну. Когда программа будет запускаться, Python должен взять имя из файла, если это возможно, если файла ‘name.json’ не существует, запросить имя и сохранить на будущее. Так как в случае отсутствия файла будет возникать ошибка, воспользуемся блоком try-except.
filename = ‘name.json’
try:
with open (filename) as f :
name = json.load ( f )
except FileNotFoundError:
name = input («Введите ваше имя: «)
with open (filename, ‘w’) as f :
json.dump (numbers, f )
print(f»Добро пожаловать на сайт !»)
else:
print(f»С возвращением !»)
В начале программа пытается открыть файл ‘name.json’. Если файл существует и не возникает ошибка FileNotFoundError , то выводится сообщение из блока else. Если программа запускается впервые и файла не существует, возникает ошибка и пользователю предлагают ввести имя. При первом выполнение программы результат выглядит так:
Введите ваше имя: Жак
Добро пожаловать на сайт Жак!
Если программа была выполнена хоть один раз, то результат выглядит так:
С возвращением Жак!
Чтение и запись в файл 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, наберите в командной строке следующий код:
Сортировка
В 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)