4.4 Запись структурированных файлов

Содержание

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)