4.4 Запись структурированных файлов#
Последняя тема в рамках курса, на которой мы остановимся, - это чтение и запись структурированных файлов в форматах json.
Модуль JSON#
JSON — это облегченный формат обмена данными, фактически он представляет из себя запись объекта словаря в виде обычного текста, который можно сохранить в любой текстовый формат. Он используется для хранения и передачи данных между различными платформами и языками. В Python имеется одноименные встроенный модуль, который предоставляет методы для кодирования python-объектов в строки и декодирования строк обратно в python-объекты.
import json
JSON - достаточно простой модуль. Он включает в себя буквально четыре функции, две из которых позволяют преобразовывать строки к python-объектам, а две из которых производить обратные операции.
Для рассмотрения функционала модуля создадим пример исходных данных. Представим, что у нас есть некоторая структура данных, описывающая города:
city = {"name": "Moscow", "coordinates": (55.753, 37.620)} # пример данных
Для записи объектов в строки используются функции dump и dumps
dump - получает на вход словарь и записывает его в файл
dumps - получает на вход словарь и преобразует его к строке
city_text = json.dumps(city)
city_text
'{"name": "Moscow", "coordinates": [55.753, 37.62]}'
with open('data/city.json', 'w', encoding='utf8') as f:
json.dump(city, f)
Для чтения используются функции load и loads
load - получает на вход объект файла и преобразует его в словарь
loads - получает на вход строку и преобразует ее в словарь
json.loads(city_text)
{'name': 'Moscow', 'coordinates': [55.753, 37.62]}
with open('data/city.json', 'r', encoding='utf8') as f:
city = json.load(f)
print(city)
print(city["name"])
{'name': 'Moscow', 'coordinates': [55.753, 37.62]}
Moscow
GeoJSON#
Сам по себе json может иметь любую структуру. В случае работы с геоданными существует описание структуры файла json, из каких ключей и значений он должен состоять, чтобы различные ГИСы могли его корректно прочитать и интерпретировать. Такое описание для ГИСов называется форматом GeoJSON. С подробным описанием формата можно ознакомиться в официальных источниках.
В качестве простого обобщенного примера можно использовать следующую структуру:
geojson = {
"type": "FeatureCollection",
"features": []
}
Так, мы получаем достаточно простой словарь, где остается заполнить только информацию по отдельным объектам - feature. Каждая feature также должна соответствовать определенной структуре:
feature = {
"type": "Feature",
"properties": {},
"geometry": {}
}
properties - в данном случае будет играть роль таблицы атрибутов
geometry - описание геометрии
Полное описание структуры словаря для одного объекта города будет выглядеть следующим образом:
geojson = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"name": "Moscow"},
"geometry": {"type": "Point", "coordinates": [55.753, 37.62]}
},
]
}
Если данное описание сохранить с помощью модуля json, то далее оно может быть открыто в любых ГИСах:
with open('data/city.geojson', 'w', encoding='utf8') as f:
json.dump(geojson, f)
Практические задания