Продолжая тему клиент-серверных приложений, затронем такой момент, как формат хранения данных, которые идут от этого самого клиенту к этому самому серверу.
Какие еще форматы данных?
Клиент-серверная архитектура подразумевает обмен данными, которые обрабатываются на стороне сервера и возвращаются в определенном виде клиенту. Такие данные обычно структурированы и сохраняются в форматах, которые поддерживают его CSV, JSON или YAML. Процесс обработки пакетов данных и их последующее сохранение называют сериализацией данных. . Вышеперечисленные форматы могут применяться для сохранения данных в табличном виде (логи, сетевые параметры, результаты обработки данных в приложениях и т.д.)
Формат CSV
CSV (comma-separated value) — формат передачи данных в виде таблиц. Данные можно извлечь из самой таблицы — отдельная строка файла соответствует строке таблицы, а разделителем может быть не только запятая, но и любые другие.
Как выглядят данные записанные в формате CSV?
Это определенный набор списков. Первый — названия столбцов, все остальные — значения.
Как прочитать данные из файла .csv?
В Python есть специальный модуль для работы с этим форматом — csv. Чтобы прочитать данные с файла используется метод reader. В качестве параметра ей передается ссылка на файл (объект), с которого будет считана информация
[code]
import csv
with open(‘alco_data.csv’) as file:
read_file = csv.reader(file)
for data in read_file:
print(data)
import csv
with open(‘alco_data.csv’) as file:
read_file = csv.reader(file)
print(list(read_file))
[/code]
Как отделить заголовки от содержимого в CSV?
Чтобы отделить заголовки от содержимого можно использовать метод next
[code]
import csv
with open(‘alco_data.csv’) as file:
read_file = csv.reader(file)
headers = next(read_file)
print(‘Headers: ‘, headers)
for data in read_file:
print(data)
[/code]
Метод DictReader
В модуле csv есть отдельный метод для вывода данных таким образом, чтобы каждой строке таблицы соответствовал словарь (dict), в котором в котором элементы представляют собой связку {key (название столбца): value (значение столбца)}. Метод называется DictReader
[code]
import csv
with open(‘alco_data.csv’) as file:
read_file = csv.DictReader(file)
for data in read_file:
print(data)
import csv
with open(‘alco_data.csv’) as file:
read_file = csv.DictReader(file)
for data in read_file:
print((data[‘store’], data[‘name’]))
[/code]
Как записать данные в файл формата .csv?
По аналогии с чтением данных, в Питоне, с помощью модуля csv, можно записать данные формата csv в файл. Сделать это можно с помощью метода csv.writer(file)
[code]
import csv
data =
with open(‘alco_data_write.csv’, ‘w’) as file:
datawrite = csv.writer(file)
for info in data:
datawrite.writerow(info)
with open(‘alco_data_write.csv’) as file:
print(file.read())
[/code]
Правилом хорошего тона считается указывать кавычки для каждого значения. Их можно не указывать, но часто это приветствуется:
[code]
import csv
data =
with open(‘alco_data_write.csv’, ‘w’) as file:
datawrite = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC)
for info in data:
datawrite.writerow(info)
with open(‘alco_data_write.csv’) as file:
print(file.read())
[/code]
Метод writerows
Метод writecows создан для передачи объекта (список, кортеж), в которых содержаться данные, в качестве аргумента. Это избавит от построчного записывания данных в файл.
[code]
import csv
data =
with open(‘alco_data_write.csv’, ‘w’) as file:
datawrite = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC)
datawrite.writerows(data)
with open(‘alco_data_write.csv’) as file:
print(file.read())
[/code]
Метод DictWriter
DictWriter — метод из модуля csv, которые работает только со словарями Python версии от 3.6 — необходимо явно указывать порядок следования столбцов в файле. За это отвечает параметр fieldnames. Можно указать свой разделитель с помощью параметра delimiter
[code]
import csv
data =
with open(‘alco_data_write.csv’, ‘w’) as file:
datawrite = csv.writer(file, delimiter=’/’)
for info in data:
datawrite.writerow(info)
with open(‘alco_data_write.csv’) as file:
print(file.read())
[/code]
Формат JSON
JSON — популярный в web’е формат передачи, хранения и обмена данными. Конечно же в Питоне тоже есть специальный модуль для работы с такими данными — json. Как выглядит обычный JSON-файл? Что у него внутри?
[code]
{
«action»: «msg»,
«to»: «morisk»,
«from»: «me»,
«encoding»: «ascii»,
«message»: «Buy Whisky»
}
[/code]
Как прочитать JSON-формат в Python?
Для чтения данных из JSON-объектов используются методы load и loads модуля json. Первый считывает файл в JSON-формате и возвращает python-объекты. Второй — отвечает за считывание строки в JSON-формате и тоже возвращает python-объекты
[code]
#метод load (обычное чтение json-файла)
import json
with open(‘alco_json.json’) as file:
data = json.load(file)
print(type(data)) #класс — словарь
for section, commands in data.items():
print(section)
print(commands)
#метод loads (чтение json-строк)
with open(‘alco_json.json’) as file:
filedata = file.read()
print(type(filedata)) #класс — строка
object = json.loads(filedata)
print(type(object)) #класс — словарь
print(object)
for section, commands in object.items():
print(section)
print(commands)
[/code]
Как записать JSON-формат в Python?
Методы dump и dumps из модуля json помогают нам записать данные в формате json на Питоне. Dump сохраняет python-объект в файл .json. Dumps — возвращает строку в JSON-формате — например, для последующей ее передачи в API. Методы dump() и dumps() пользуются одними и теми же аргументами ключевых слов. Формат JSON может не совпадать с исходным python-форматом. Например, кортежи при записи в JSON конвертируются в списки.
[code]
import json
jsonwrite = { #записываем словарь на python в объект json
«action»: «msg»,
«to»: «morisk»,
«from»: «me»,
«encoding»: «ascii»,
«message»: «Buy Whisky»
}
with open(‘alco_json.json’, ‘w’) as file:
file.write(json.dumps(jsonwrite))
with open(‘alco_json.json’) as file:
print(file.read())
jsonwrite = { #метод dump
«action»: «msg»,
«to»: «morisk»,
«from»: «me»,
«encoding»: «ascii»,
«message»: «Buy Whisky»
}
with open(‘alco_json.json’, ‘w’) as file:
json.dump(jsonwrite, file, sort_keys=True, indent=2)
with open(‘alco_json.json’) as file:
print(file.read())
[/code]
Как преобразуются данные при сериализации JSON?
Python | JSON |
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
JSON | Python |
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
При использовании формата JSON есть ограничение: нет возможности сохранить словарь, где в качестве ключей — кортежи
Формат YAML
YAML («Ain’t Markup Language») — формат сериализации данных, который считают максимально user-friendly по синтаксису и удобству форматирования данных. Структура и синтаксис практически такой же, как на Python — используются отступы, сделанные с помощью пробелов (использовать tab нельзя). Список в YAML — структурирован. При этом каждый элемент записывается в своей строке и маркируется символом «- » (обязательно с пробелом после него). Все строки набора должны иметь одинаковую величину отступа. Все эти же правила справедливы и для типа данных «словарь» (dict). В YAML так же могут быть комбинации элементов в словаре (dict) каждому ключу будет соответствовать набор элементов в виде списка (list)
[code]
# список с элементами (строки)
[‘action’, ‘to’, ‘from’, ‘encoding’, ‘message’]
# структурированный список
— action
— to
— from
— encoding
— message
# строки в словаре
{‘action’: ‘msg’, ‘to’: ‘account_name’}
# словарь в виде блока
‘action’: ‘msg’
‘to’: ‘account_name’
# спецсимволы в строках
command: «action | to»
# примеры комбинаций элементов
# словарь с элементами-списками
message:
— msg_1
— msg_2
— msg_3
to:
— account_1
— account_2
— account_3
# список словарей
— action: msg_1
to: account_1
— action: msg_2
to: account_2
[/code]
Как считать YAML-формат?
Для работы с YAML, как и с другими типами данных, в Python заготовлен отдельный модуль — yaml
[code]
import yaml
with open(‘alco_yaml_listdict.yaml’) as file:
data = yaml.load(file, Loader=yaml.FullLoader)
print(data)
[/code]
Запись данных в .yaml-файл
Как записать обычный python-объект в .yaml-файл? Предположим, что нам нужен записать словарь с элементами в виде списка в формате YAML:
[code]
import yaml
alco_list = [‘lawsons’,
‘captain morgan’,
‘bells’]
zapivon_list = [‘coca-cola’,
‘pepsi’,
‘not_zapivon’]
importyaml = {‘Alcohol’:alco_list, ‘zapivon’:zapivon_list}
with open(‘coctail.yaml’, ‘w’) as file:
yaml.dump(importyaml, file, default_flow_style=False)
with open(‘coctail.yaml’) as f_n:
print(f_n.read())
[/code]