Это старая версия документа!
Штатный вариант
Возвращает каждую строку в формате List
import csv with open('docs/orders_mini.csv', newline='') as csvfile: for row in _reader: print(type(row)) print(row)
Вариант с pandas
Библиотека конечно матерая, но есть увеличенный порог входа, там все свое, куча собственный типов/форматов данных, во всем этом надо какое то время еще разбираться
import pandas as pd data = pd.read_csv("docs/orders_mini2.csv", delimiter=';') # собственный формат dataFrame print(type(data)) print(data) # кортеж со строками, тоже матерый формат for label, content in data.items(): print(f'label: {label}') print(f'content: {content}') # так столбцы, в виде строк for content in data.keys(): print(f'content: {content}') # и еще очень много всяких функций/вариантов
# Сортировка по значению dict_result_successed = dict(sorted( dict_counted_acticles_successed.items(), key=lambda item: item[1], reverse=True)) # Сумма значений (значение понятно int) sum_successed = sum([ item for item in dict_counted_acticles_successed.values() ], 0) # Имея список с повторяющимися одиночными значениями, генерируем словарь с уникальными значениями и числом в value, начальное значение 0, далее будем считать dict_counted_acticles = { key: value for (key, value) in (zip(set(ls_only_article), itertools.repeat(0))) }
# В данном случае надо было из большого списка сформировать список с одиночными значениями плюс оставив только часть строки, вырезается регуляркой reLabelSize = re.compile(r"-[\d]{1,2}$") # Делаем список доставленных, но только артикулы, без размера lsOnlyArticle = [ reLabelSize.sub("", item["Артикул"]) for item in lsSourceBigDicts ]
Установка
sudo apt install graphviz
pip install diagrams
Использование
Группировка очень примитивная. После группировки нескольких элементов, хоть в коде и работаешь с одним объектом, группой, но стрелки рисуются с каждым элементом в группе, что добавляет не мало мусора, много мусора на самом деле добавляет
Рамка создается не всегда, только при использовании элемента «cluster» видимо, т.е. можно просто для краткости кода объединить в группу без отображения рамки
Внутри кластера так же можно устанавливать связи
Вложенная группировка таже присутствует, ограничений нет, логика вроде ясна
Параметры отображения вроде регулируются, относится к компоненту GraphViz
Свои элементы тоже создаются
Направление соединения собсна « » так же - без направления
Стрелки имеют три атрибута, цвет, тип и текст
from diagrams import Diagram, Cluster, Edge from diagrams.aws.compute import EC2 from diagrams.aws.network import ELB from diagrams.aws.network import Route53 from diagrams.onprem.database import PostgreSQL from diagrams.onprem.inmemory import Redis # Просто перечень узлов with Diagram("./images/simple_diagram") as diag: dns = Route53("dns") load_balancer = ELB("Load Balancer") database = PostgreSQL("User Database") cache = Redis("Cache") svc_group = [ EC2("Webserver 1"), EC2("Webserver 2"), EC2("Webserver 3") ] diag # С группировкой with Diagram("./images/simple_diagram") as diag: dns = Route53("dns") load_balancer = ELB("Load Balancer") database = PostgreSQL("User Database") cache = Redis("Cache") with Cluster("Web server cluster"): svc_group = [ EC2("Webserver 1"), EC2("Webserver 2"), EC2("Webserver 3") ] diag # Связи with Diagram("./images/simple_diagram") as diag: dns = Route53("dns") load_balancer = ELB("Load Balancer") database = PostgreSQL("User Database") cache = Redis("Cache") # Объединение в группу with Cluster("Web server cluster"): svc_group = [ EC2("Webserver 1"), EC2("Webserver 2"), EC2("Webserver 3") ] # Связи между элементами dns >> load_balancer >> svc_group svc_group >> cache #svc_group >> database diag # Форматирование стрелок with Diagram("./images/simple_diagram") as diag: dns = Route53("dns") load_balancer = ELB("Load Balancer") cache = Redis("Cache") # Объединение в группу with Cluster("Web server cluster"): svc_group = [ EC2("Webserver 1"), EC2("Webserver 2"), EC2("Webserver 3") ] # Связи между элементами dns >> Edge(color="red", style="bold") << load_balancer >> svc_group svc_group >> Edge(label="this text") >> cache diag # Пар-ры графика # Конструктор принимает: # outformat=["jpg", "png", "dot"] - формат выходного файла, можно сразу несколько # filename="my_diagram" - имя файла, show=False показ, direction="TB" - направление # Так же, можно задавать доп аттрибуты graph_attr = { "fontsize": "45", "bgcolor": "transparent" } with Diagram("./images/simple_diagram", graph_attr = graph_attr) as diag: dns = Route53("dns") load_balancer = ELB("Load Balancer") cache = Redis("Cache") # Объединение в группу with Cluster("Web server cluster"): svc_group = [ EC2("Webserver 1"), EC2("Webserver 2"), EC2("Webserver 3") ] # Связи между элементами dns >> load_balancer >> svc_group svc_group >> cache diag # Связи внутри кластера with Diagram("./images/Grouped Workers"): dns = Route53("dns") web = Redis("cache") with Cluster("DB cluster"): db_primary = PostgreSQL("primary") db_primary - [PostgreSQL("replica1"), PostgreSQL("replica2")] dns >> web >> db_primary
from diagrams import Diagram, Cluster, Node with Diagram('./output/output', show=False, outformat='svg') as d: with Cluster('cluster'): n1 = Node('A', height = '0.5', width = '5', labelloc = "c", fillcolor = 'purple', fontcolor = 'white', style = 'filled') n2 = Node('B', height = '0.5', width = '5', labelloc = "c", fillcolor = 'purple', fontcolor = 'white', style = 'filled') n3 = Node('C', height='0.5', width='5', labelloc="c", fillcolor='purple', fontcolor='white', style='filled') n4 = Node('D', height='0.5', width='5', labelloc="c", fillcolor='purple', fontcolor='white', style='filled')
Располагаем py файлы по пути например «.ansible\collections\ansible_collections\community\general\plugins\modules» (в целом расположения указываются в конфиге). Тут можно сделать подпапку
В данном примере файл «try_diagrams» в подпапке «my_diagrams»
--- - name: "Show list" community.general.my_diagrams.try_diagrams: my_variable: 'dcdc'
#!/usr/bin/python from __future__ import (absolute_import, division, print_function) __metaclass__ = type from ansible.module_utils.basic import AnsibleModule def main(): module = AnsibleModule( argument_spec = dict( cluster_list = dict(type = 'str', required = True), mode = dict(type = 'str', default = 'first', choices = ['first', 'second']) ), supports_check_mode = True) # Полученные аргументы cluster_list = module.params['cluster_list'] mode = module.params['mode'] # Возвращаемое значение # некоторые зарезервированы, такие как change, другие можно добавлять любые кастомные, в выводе видно при "-vvv", там уже как удобнее будет извлекать # module.exit_json(changed=True) module.exit_json(msg="this is mymsg", data = 'this is mydata', myvar = 'this my variable') # Для ошибки # module.fail_json(msg="Failed to send message") # Класс для примера, тут не используется class myClass(): def get_list(self, name_screens): return name_screens + 'ddcdc' if __name__ == '__main__': main()
Сортировка в списке словарей, по одному значению внутри словаря
# Структура в таком виде ls_finished_log_records.append({ 'current_name': current_filename, 'clear_name': clear_file_name, 'duration': int(duration) }) # Cортировкa по полю "duration" ls_finished_log_records.sort(key=lambda item:item['duration'], reverse=True)
Подстановка переменных в строку
# print(f'{var1}_{var2}') # print('{}_{}'.format(var1,var2))