Инструменты пользователя

Инструменты сайта


develop:pyton:practics

Это старая версия документа!


Practics

Seller

:!: Работа с csv /pandas

Штатный вариант
Возвращает каждую строку в формате 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 ]

Diagrams

:!: модуль diagrams

Статья
Дока

Установка
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')

Модули для Ansible

Располагаем 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()

Overall

:!: Сортировка

Сортировка в списке словарей, по одному значению внутри словаря

# Структура в таком виде
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)
 
:!:
 
develop/pyton/practics.1709444237.txt.gz · Последнее изменение: 2024/03/03 05:37 — admin