Надоело бегать по кругу, ежедневно выполняя один и тот же набор скучных задач? Просто вооружитесь средствами автоматизации из арсенала «змеиного языка» и позвольте компьютеру сделать всю работу за вас.
«Автоматизация — не враг, а союзник человека. Она освобождает работника от тяжелого труда, давая возможность заниматься более творческими и вдохновляющими делами»
— Роберт Нойс, американский инженер, основатель компании Intel.
Python — это мощный и универсальный язык разработки, который отлично подходит для автоматизации различных задач. Многочисленные скрипты (готовые к исполнению элементы кода), написанные для «змеиного языка» могут помочь любому пользователю, знакомому с основами программирования на Python, высвободить рабочее время от рутины.
Содержание:
- Передача файлов
- Мониторинг системы
- Парсинг веб-страниц
- Скрапинг изображений
- Электронная почта
- Конвертация текста в речь
- Чтение и изменение CSV-файла
- Конвертация PDF в CSV
- Сжатие изображений
- Конвертация из JSON в YAML и обратно
- Извлечение текста из PDF
- Обработка аудиофайлов
- Воспроизведение музыки в случайном порядке
- Фильтрация текста
- Сопоставление с образцом при помощи регулярных выражений
- Анализ данных
- Задачи компьютерного зрения
- Шифрование данных
- Тестирование и отладка
- Прогнозирование временных рядов
Здесь собраны примеры встроенных модулей и библиотек Python для автоматизации ряда популярных повторяющихся задач разной сложности — от конвертации файлов до анализа больших массивов данных. Этот обзор пригодиться всем, кто устал тратить время на утомительные задачи или хочет повысить свою эффективность (или хотя бы еще несколько часов в сутках, чтобы всласть прокрастинировать). Да начнется автоматизация с Python!
Передача файлов
Python предоставляет немало библиотек и модулей, которые можно использовать для создания сценария автоматической передачи файлов по сети или между компьютерами. В их число входят, такие инструменты, как socket, ftplib, smtplib и paramiko.
Ниже приведен пример простого скрипта Python, который использует модуль «socket» для передачи файла по сети:
import socket # create socket s = socket.socket() # bind socket to a address and port s.bind(('localhost', 12345)) # put the socket into listening mode s.listen(5) print('Server listening...') # forever loop to keep server running while True: # establish connection with client client, addr = s.accept() print(f'Got connection from {addr}') # receive the file name file_name = client.recv(1024).decode() try: # open the file for reading in binary with open(file_name, 'rb') as file: # read the file in chunks while True: chunk = file.read(1024) if not chunk: break # send the chunk to the client client.sendall(chunk) print(f'File {file_name} sent successfully') except FileNotFoundError: # if file not found, send appropriate message client.sendall(b'File not found') print(f'File {file_name} not found') # close the client connection client.close()
Выполнение скрипта
Этот сценарий запускает сервер, который прослушивает входящие соединения по адресу «localhost» и порту «12345». Когда клиент подключается, сервер получает имя файла от клиента, а затем считывает и отправляет содержимое файла фрагментами клиенту. Если файл не найден, сервер отправляет клиенту соответствующее сообщение.
Как упоминалось выше, существуют другие библиотеки и модули, которые можно использовать для создания сценария передачи файлов на python, например, ftplib для подключения и передачи файла с использованием протокола ftp и paramiko для передачи по протоколу SFTP (протокол передачи файлов SSH). Сценарий может быть адаптирован в соответствии с конкретными требованиями или сценариями.
Мониторинг системы
Скрипты Python часто используется для мониторинга производительности и состояния компьютера или сети. Например, с их помощью можно отслеживать такие показатели, как загрузка ЦП, использование памяти, дискового пространства, сетевой трафик и время безотказной работы системы. Скрипт также можно использовать для отслеживания определенных событий или условий, таких как возникновение ошибки или доступность определенной службы.
Выполнение скрипта
import psutil # Get the current CPU usage cpu_usage = psutil.cpu_percent() # Get the current memory usage memory_usage = psutil.virtual_memory().percent # Get the current disk usage disk_usage = psutil.disk_usage("/").percent # Print the collected data print(f"CPU usage: {cpu_usage}%") print(f"Memory usage: {memory_usage}%") print(f"Disk usage: {disk_usage}%")
Приведенный выше скрипт использует функции «cpu_percent», «virtual_memory» и «disk_usage» из модуля «psutil» для получения данных о текущем использовании ЦП, памяти и жесткого диска соответственно.
Функция «virtual_memory» возвращает объект с различными свойствами, такими как общий объем памяти и объем используемой и свободной памяти. Функция «disk_usage» принимает в качестве аргумента путь и возвращает объект с такими свойствами, как общий объем места на диске и количество используемого и свободного места.
Парсинг веб-страниц
Автоматизация веб-скрапинга — одна из самых популярных областей применения скриптов Python. Пакеты таких библиотек, как selenium и beautifulsoup4 широко используются для извлечения данных с веб-сайтов и их хранения в структурированном формате. Например, в виде электронной таблицы или базы данных. Подобная автоматизация облегчает регулярный сбор данных для их анализа или отслеживания изменений на веб-сайте.
Выполнение скрипта
В приведенном ниже примере представлены возможности пакета BeautifulSoup:
import requests from bs4 import BeautifulSoup # Fetch a web page page = requests.get("http://www.example.com") # Parse the HTML content soup = BeautifulSoup(page.content, "html.parser") # Find all the links on the page links = soup.find_all("a") # Print the links for link in links: print(link.get("href"))
Используя этот инструмент, можно найти все ссылки на странице. Метод «find» позволит найти первый элемент, а метод «find_all» находит все элементы. Также можно изменить скрипт, чтобы очищать другие типы данных или переходить на разные страницы сайта.
Скрапинг изображений
Этот скрипт Python пригодится, если нужно автоматизировать «сканирование» и выгрузку не веб-страниц целиком, а только изображений с указанных сайтов. Для его работы потребуются пакеты библиотек selenium и beautifulsoup4, которые нужно будет предварительно установить с помощью диспетчера пакетов pip следующим образом:
pip install selenium beautifulsoup4
Кроме того, потребуется загрузить драйвер Chrome, в соответствии с версией используемого браузера Chrome и ОС. В дальнейшем нужно будет ввести путь к файлу «chromedriver», который запрашивает программа.
Выполнение скрипта
Чтобы запустить скрипт, нужно открыть терминал в корневом каталоге скрипта и ввести команду:
python3 scrap-img.py
Скрипт запросит:
- путь к драйверу Chrome, который был загружен на подготовительном шаге;
- URL-адрес, с которого нужно загрузить изображения.
from selenium import webdriver import requests as rq import os from bs4 import BeautifulSoup import time # path= E:\web scraping\chromedriver_win32\chromedriver.exe path = input("Enter Path : ") url = input("Enter URL : ") output = "output" def get_url(path, url): driver = webdriver.Chrome(executable_path=r"{}".format(path)) driver.get(url) print("loading.....") res = driver.execute_script("return document.documentElement.outerHTML") return res def get_img_links(res): soup = BeautifulSoup(res, "lxml") imglinks = soup.find_all("img", src=True) return imglinks def download_img(img_link, index): try: extensions = [".jpeg", ".jpg", ".png", ".gif"] extension = ".jpg" for exe in extensions: if img_link.find(exe) > 0: extension = exe break img_data = rq.get(img_link).content with open(output + "\\" + str(index + 1) + extension, "wb+") as f: f.write(img_data) f.close() except Exception: pass result = get_url(path, url) time.sleep(60) img_links = get_img_links(result) if not os.path.isdir(output): os.mkdir(output) for index, img_link in enumerate(img_links): img_link = img_link["src"] print("Downloading...") if img_link: download_img(img_link, index) print("Download Complete!!")
Электронная почта
Упомянутый выше скрипт smtplib можно использовать для автоматической отправки электронных писем на основе определенных условий. Например, он подойдет для отправки ежедневного отчета своей команде или напоминания самому себе, когда приближается важный срок.
Выполнение скрипта
Ниже приведен пример того, как отправить электронное письмо с помощью «питоновского» модуля smtplib, клиента электронной почты и протокола SMTP (Simple Mail Transfer Protocol):
import smtplib from email.mime.text import MIMEText # Set the SMTP server and login credentials smtp_server = "smtp.gmail.com" smtp_port = 587 username = "your@email.com" password = "yourpassword" # Set the email parameters recipient = "recipient@email.com" subject = "Test email from Python" body = "This is a test email sent from Python." # Create the email message msg = MIMEText(body) msg["Subject"] = subject msg["To"] = recipient msg["From"] = username # Send the email server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() server.login(username, password) server.send_message(msg) server.quit()
Класс «SMTP» из примера используется для создания SMTP-клиента, методы «starttls» и «login» для установки безопасного соединения, а класс «MIMEText» из модуля электронной почты для создания сообщения электронной почты в формате MIME (Multipurpose Internet Mail Extensions).
После создания сообщения электронной почты метод «send_message» объекта «SMTP» используется для отправки сообщения. Затем вызывается метод «quit», чтобы закрыть соединение с SMTP-сервером.
Конвертация текста в речь
Для этого скрипта можно использовать API облачного сервиса Text-to-Speech от Google, который позволяет разработчикам генерировать человеческую речь. API преобразует текст в аудиоформаты, например, WAV, MP3 или Ogg Opus. Он также поддерживает входные данные языка разметки синтеза речи (SSML) для указания пауз, чисел, форматирования даты и времени и других инструкций по произношению.
from pygame import mixer from gtts import gTTS def main(): tts = gTTS('Like This Article') tts.save('output.mp3') mixer.init() mixer.music.load('output.mp3') mixer.music.play() if __name__ == "__main__": main()
Чтение и изменение CSV-файлов
CSV (Comma Separated Values, «значения, разделенные запятыми») — распространенный формат для импорта и экспорта электронных таблиц из таких программ, как Excel. Python может читать CSV, а это означает, что он может копировать и сохранять его содержимое для выполнения других задач.
Выполнение скрипта
Приведенный ниже сценарий использования модуля csv позволит читать и распечатывать содержимое CSV-файла «customers.csv», добавляя запятые между элементами.
import csv #replace 'customers.csv' with your filename or path to file (i.e. /Desktop/folder/file.csv) with open('customers.csv', newline='') as csvfile: cust_reader = csv.reader(csvfile, delimiter=' ', quotechar='|') for row in cust_reader: print(', '.join(row))
Также можно автоматически дополнять содержимое CSV-файла без необходимости ввода новых данных вручную.
import csv Row = ['James Smith', 'james@smith.com', 200000] # Make sure 'customers.csv' is in your root directory, or provide path to open() method. # pass in 'a' to append new row or 'w' to overwrite CSV file with open('customers.csv', 'a', newline='') as csvfile: cust_writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) cust_writer.writerow(Row)
Конвертация PDF в CSV
Этот скрипт может пригодиться в случаях, когда нужно преобразовать данные PDF в формат CSV, чтобы использовать их для дальнейшего анализа.
Выполнение скрипта
Для начала нужно будет установить библиотеку tabula-py с помощью системы управления программными пакетами PIP. После установки, можно передать файл в свой проект.
import tabula filename = input("Enter File Path: ") df = tabula.read_pdf(filename, encoding='utf-8', spreadsheet=True, pages='1') df.to_csv('output.csv')
Библиотека имеет функцию «read_pdf()», которая считывает PDF-файлы. Завершающим этапом автоматизации станет использование функции «to_csv()» для сохранения вывода с PDF в CSV.
Сжатие изображений
Этот скрипт позволяет уменьшить размер изображения, сохранив при этом его качество. Для этого можно использовать специализированную библиотеку PIL (Python Imaging Library). В ее функциональность входит управление изображениями, добавление фильтров, размытие, повышение резкости, сглаживание, обнаружение краев, сжатие изображений и многое другое.
import PIL from PIL import Image from tkinter.filedialog import * fl=askopenfilenames() img = Image.open(fl[0]) img.save("output.jpg", "JPEG", optimize = True, quality = 10)
Конвертация из JSON в YAML и обратно
Эти скрипты пригодятся тем, кто работает с файлами конфигурации обоих форматов, но предпочитает один из них.
JSON в YAML — выполнение скрипта
import json import os import sys import yaml # Checking there is a file name passed if len(sys.argv) > 1: # Opening the file if os.path.exists(sys.argv[1]): source_file = open(sys.argv[1], "r") source_content = json.load(source_file) source_file.close() # Failing if the file isn't found else: print("ERROR: " + sys.argv[1] + " not found") exit(1) # No file, no usage else: print("Usage: json2yaml.py <source_file.json> [target_file.yaml]") # Processing the conversion output = yaml.dump(source_content) # If no target file send to stdout if len(sys.argv) < 3: print(output) # If the target file already exists exit elif os.path.exists(sys.argv[2]): print("ERROR: " + sys.argv[2] + " already exists") exit(1) # Otherwise write to the specified file else: target_file = open(sys.argv[2], "w") target_file.write(output) target_file.close()
Результат может быть отправлен на стандартный вывод или в указанный файл.
$ json2yaml.py input_file.json output_file.yaml
Но что, если нужно пойти в противоположном направлении? Не проблема — приведенный ниже скрипт преобразует файл из YAML в JSON.
YAML в JSON — выполнение скрипта
import json import os import sys import yaml # Checking there is a file name passed if len(sys.argv) > 1: # Opening the file if os.path.exists(sys.argv[1]): source_file = open(sys.argv[1], "r") source_content = yaml.safe_load(source_file) source_file.close() # Failikng if the file isn't found else: print("ERROR: " + sys.argv[1] + " not found") exit(1) # No file, no usage else: print("Usage: yaml2json.py <source_file.yaml> [target_file.json]") # Processing the conversion output = json.dumps(source_content) # If no target file send to stdout if len(sys.argv) < 3: print(output) # If the target file already exists exit elif os.path.exists(sys.argv[2]): print("ERROR: " + sys.argv[2] + " already exists") exit(1) # Otherwise write to the specified file else: target_file = open(sys.argv[2], "w") target_file.write(output) target_file.close()
Результат может быть отправлен на стандартный вывод или в указанный файл.
$ yaml2json.py input_file.yaml output_file.json
Извлечение текста из PDF-файла
Python предоставляет простой способ извлечения текста из PDF-файлов с помощью опенсорсной библиотеки PyPDF2. Этот способ будет полезен для интеллектуального анализа данных, сверки счетов или создания отчетов, а процесс извлечения можно автоматизировать всего несколькими строками кода.
Выполнение скрипта
Установить пакет можно, запустив следующую команду в терминале:
pip install PyPDF2
Ниже приведены несколько примеров практического применения Py2PDF2.
Например, имеется многостраничный PDF, из которого нужна только первая страница. Приведенный ниже скрипт позволяет извлечь текст с первой страницы PDF-документа:
# import module PyPDF2 import PyPDF2 # put 'example.pdf' in working directory # and open it in read binary mode pdfFileObj = open('example.pdf', 'rb') # call and store PdfFileReader # object in pdfReader pdfReader = PyPDF2.PdfFileReader(pdfFileObj) # to print the total number of pages in pdf # print(pdfReader.numPages) # get specific page of pdf by passing # number since it stores pages in list # to access first page pass 0 pageObj = pdfReader.getPage(0) # extract the page object # by extractText() function texts = pageObj.extractText() # print the extracted texts print(texts)
Объединение двух файлов в один
Другой вариант — нужно скопировать текст из двух PDF-файлов и объединить его в новый PDF-файл. Для этого можно использовать приведенный ниже код:
import PyPDF2 # open two pdfs pdf1File = open('example.pdf', 'rb') pdf2File = open('example2.pdf', 'rb') # read first pdf pdf1Reader = PyPDF2.PdfFileReader(pdf1File) # read second pdf pdf2Reader = PyPDF2.PdfFileReader(pdf2File) # for writing in new pdf file pdfWriter = PyPDF2.PdfFileWriter() for pageNum in range(pdf1Reader.numPages): pageObj = pdf1Reader.getPage(pageNum) pdfWriter.addPage(pageObj) for pageNum in range(pdf2Reader.numPages): pageObj = pdf2Reader.getPage(pageNum) pdfWriter.addPage(pageObj) # create new pdf 'example3.pdf' pdfOutputFile = open('example3.pdf', 'wb') pdfWriter.write(pdfOutputFile) pdfOutputFile.close() pdf1File.close() pdf2File.close()
Обработка аудиофайлов
Pydub — пакет Python, который позволяет совершать разнообразные манипуляции со звуком, включая преобразование в различные форматы (например, wav или mp3) или выборочное увеличение/уменьшение громкости на одном аудиотреке. Pydub может сегментировать аудиофайл на миллисекундные сэмплы, что может быть особенно полезно для задач машинного обучения.
Выполнение скрипта
Pydub можно установить, введя в терминале команду Python:
pip install pydub
Допустим, при работе со звуком, нужно убедиться, что каждый файл имеет правильную громкость. Для автоматизации этой задачи можно использовать приведенный ниже скрипт:
from pydub import AudioSegment audio_file = AudioSegment.from_mp3("example.mp3") louder_audio_file = audio_file + 18 louder_audio_file.export("example_louder.mp3", format="mp3")
Воспроизведение музыки в случайном порядке
Этот скрипт будет полезен для меломанов, не представляющих работы за компьютером без любимой музыкальной коллекции. Он случайным образом выбирает трек из папки с альбомами или сборниками, а затем воспроизводит ее с помощью модуля «os».
Выполнение скрипта
Скрипт переходит в музыкальный каталог, содержащий все песни, которые нужно воспроизвести, и помещает их в список.
import random, os music_dir = 'E:\\music diretory' songs = os.listdir(music_dir) song = random.randint(0,len(songs)) # Prints The Song Name print(songs[song]) os.startfile(os.path.join(music_dir, songs[0]))
Затем функция «startfile()» модуля «os» запускает в случайном порядке файлы треков с помощью связанного с ним приложения на основе расширения.
Фильтрация текста
Сопоставлять и фильтровать текст с помощью регулярных выражений в Python довольно просто, что может дать существенное преимущество в устранении рутинных операций.
Выполнение скрипта
Для примера возьмем систему для пакетной обработки сообщений с подтверждением продажи, для работы которой нужно наладить автоматическое вычленение номера кредитной карты из массива текста сообщения электронной почты.
Приведенный ниже скрипт может быстро найти любой номер кредитной карты, соответствующий шаблону, что позволяет легко отфильтровать эту информацию из любого текстового содержимого:
# Filter Text # Import re module import re # Take any string data string = """a string we are using to filter specific items. perhaps we would like to match credit card numbers mistakenly entered into the user input. 4444 3232 1010 8989 and perhaps another? 9191 0232 9999 1111""" # Define the searching pattern pattern = '(([0-9](\s+)?){4}){4}' # match the pattern with input value found = re.search(pattern, string) print(found) # Print message based on the return value if found: print("Found a credit card number!") else: print("No credit card numbers present in input")
Сопоставление с образцом при помощи регулярных выражений
Сбор данных из неструктурированных источников может быть очень утомительным процессом. Как и в предыдущем примере с фильтрацией, Python позволяет выполнять более детальное сопоставление с образцом с помощью регулярных выражений. Это полезно для категоризации текстовой информации в процессе регулярной обработки данных или поиска определенных ключевых слов в пользовательском контенте.
В Python есть встроенная библиотека регулярных выражений re, для использования которой достаточно просто освоить синтаксис регулярных выражений. С ее помощью можно автоматизировать практически любой скрипт сопоставления с образцом.
Например, этот скрипт позволит автоматически сопоставить любые адреса электронной почты, найденные в обрабатываемом тексте:
import re emailRegex = re.compile(r'''( [a-zA-Z0-9._%+-]+ # username @ # @ symbol [a-zA-Z0-9.-]+ # domain name (\.[a-zA-Z]{2,4}) # dot-something )''', re.VERBOSE) # store matched addresses in an array called "matches" matches = [] text = """ An example text containing an email address, such as user@example.com or something like hello@example.com """ # search the text and append matched addresses to the "matches" array for groups in emailRegex.findall(text): matches.append(groups[0]) # matches => ['user@example.com', 'hello@example.com'] print(matches)
А этот скрипт Python поможет сопоставить номера телефонов в тексте:
import re text = """ Here is an example string containing various numbers, some of which are not phone numbers. Business Address 4553-A First Street Washington, DC 20001 202-555-6473 301-555-8118 """ phoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code (\s|-|\.)? # separator (\d{3}) # first 3 digits (\s|-|\.) # separator (\d{4}) # last 4 digits (\s*(ext|x|ext.)\s*(\d{2,5}))? # extension )''', re.VERBOSE) matches = [] for numbers in phoneRegex.findall(text): matches.append(numbers[0]) # matches => ['202-555-6473', '301-555-8118'] print(matches)
Анализ данных
Открытая библиотека Pandas — мощный инструмент для анализа и обработки данных на Python.
Выполнение скрипта
Следующий сценарий демонстрирует, как использовать ее для автоматизации процесса очистки, преобразования и анализа набора данных:
import pandas as pd # Reading a CSV file df = pd.read_csv("data.csv") # Cleaning data df.dropna(inplace=True) # Dropping missing values df = df[df["column_name"] != "some_value"] # Removing specific rows # Transforming data df["column_name"] = df["column_name"].str.lower() # Changing string to lowercase df["column_name"] = df["column_name"].astype(int) # Changing column datatype # Analyzing data print(df["column_name"].value_counts()) # Prints the frequency of unique values in the column # Saving the cleaned and transformed data to a new CSV file df.to_csv("cleaned_data.csv", index=False)
Это достаточно простой пример использования библиотеки, служащий для демонстрации ее базовых возможностей. В реальных сценариях набор данных может быть намного больше, а операции очистки, преобразования и анализа, вероятно, будут более сложными.
Задачи компьютерного зрения
Python и его библиотеки с успехом применяются для автоматического выполнения различных операций обработки изображений и компьютерного зрения. Один из самых популярных инструментов для подобных целей — OpenCV.
Это очень мощная библиотека, основная специализация которой — реализация функций компьютерного зрения в реальном времени. Она предоставляет широкую функциональность, включая ввод-вывод изображений и видео, обработку изображений, анализ видео, обнаружение и распознавание объектов и многое другое.
Выполнение скрипта
Приведенный ниже скрипт обнаруживает лица на изображении:
import cv2 # Load the cascade classifier for face detection face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # Load the image img = cv2.imread("image.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Detect faces faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) # Draw rectangles around the faces for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # Show the image cv2.imshow("Faces", img) cv2.waitKey(0) cv2.destroyAllWindows()
Он начинается с загрузки каскадного классификатора детекции «face_cascade», представляющего собой предварительно обученную модель, которая может распознавать лица на изображении. Затем загружает изображение и преобразует его в оттенки серого с помощью метода «cv2.cvtColor()». Далее изображение передается методу классификатора «detectMultiScale()», который обнаруживает лица на изображении. Метод возвращает список координат обнаруженных лиц.
Затем скрипт перебирает список координат и рисует прямоугольники баундинг-боксов вокруг обнаруженных лиц, используя метод «cv2.rectangle()». Наконец, изображение отображается на экране с помощью метода «cv2.imshow()».
Это всего лишь базовый пример того, чего можно достичь с помощью OpenCV, и существует множество других функций, которые можно автоматизировать. Например, обнаружение и отслеживание объектов, обработка изображений, анализ видео.
Шифрование данных
Одним самых популярных инструментов для шифрования данных в Python является библиотека cryptography. Она включает в себя как рецепты высокого уровня, так и низкоуровневые интерфейсы для общих криптографических алгоритмов, таких как симметричные шифры, дайджесты сообщений и функции получения ключей. Выполнение скрипта
Следующий пример демонстрирует, как можно зашифровать файл с помощью библиотеки cryptography:
import os from cryptography.fernet import Fernet from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC password = b"super_secret_password" salt = os.urandom(16) kdf = PBKDF2HMAC( algorithm=hashes.SHA256, iterations=100000, length=32, salt=salt, backend=default_backend() ) key = base64.urlsafe_b64encode(kdf.derive(password)) cipher = Fernet(key) # Encrypt the file with open("file.txt", "rb") as f: data = f.read() cipher_text = cipher.encrypt(data) with open("file.txt", "wb") as f: f.write(cipher_text)
Скрипт начинается с создания ключа с помощью функцию получения ключа на основе пароля «PBKDF2HMAC». Функция использует алгоритм безопасного хэширования (SHA-256) и значение «соли» (salt value), генерируемое с помощью функции «os.urandom()».
Затем скрипт создает объект «Fernet», который представляет собой реализацию симметричной аутентифицированной криптографии, также известной как «секретный ключ» (secret key). После чего, cryptography считывает открытый текстовый файл, шифрует его с помощью метода «encrypt()» объекта «Fernet» и записывает зашифрованные данные в файл.
Важно! Ключ, используемый для шифрования файла, должен размещаться в надежном и защищенном от проникновения хранилище. Если ключ утерян или скомпрометирован, зашифрованные данные станут нечитаемыми.
Тестирование и отладка
В Python существует несколько популярных библиотек и фреймворков для автоматизации тестирования и отладки, например, unittest, pytest, nose и doctest.
Выполнение скрипта
Ниже приведен пример использования библиотеки unittest для автоматизации тестирования функции Python, которая находит самую длинную палиндромную подстроку в заданной строке:
def longest_palindrome(s): n = len(s) ans = "" for i in range(n): for j in range(i+1, n+1): substring = s[i:j] if substring == substring[::-1] and len(substring) > len(ans): ans = substring return ans class TestLongestPalindrome(unittest.TestCase): def test_longest_palindrome(self): self.assertEqual(longest_palindrome("babad"), "bab") self.assertEqual(longest_palindrome("cbbd"), "bb") self.assertEqual(longest_palindrome("a"), "a") self.assertEqual(longest_palindrome(""), "") if __name__ == '__main__': unittest.main()
Функция «longest_palindrome» принимает строку в качестве входных данных и возвращает самую длинную палиндромную подстроку, перебирая все возможные подстроки и проверяя:
- является ли она палиндромом;
- больше ли ее длина, чем у предыдущей.
Скрипт определил класс «TestLongestPalindrome», который наследуется от «unittest.TestCase» и содержит несколько тестовых методов. Каждый тестовый метод использует метод «assertEqual()», чтобы проверить, равен ли вывод функции «longest_palindrome()» ожидаемому результату.
При запуске сценария вызывается функция «unittest.main()», которая запускает все методы тестирования в классе «TestLongestPalindrome». Если какой-либо из тестов не пройден (т. е. вывод функции «longest_palindrome()» не будет равен ожидаемому результату), выводится сообщение об ошибке. В нем указывается, какой тест не пройден, а также каковы были ожидаемые и фактические результаты.
Прогнозирование временных рядов
В число популярных средств для автоматизации прогнозирования будущих значений данных временных рядов в Python входят библиотеки statsmodels и prophet.
Prophet основана на аддитивной модели, в которой нелинейные тренды соответствуют годовой, еженедельной и ежедневной сезонности, а также праздничным эффектам. Она лучше всего работает с временными рядами, которые имеют сильные сезонные эффекты и несколько сезонов исторических данных.
Выполнение скрипта
Ниже дан пример использования библиотеки prophet для прогнозирования временных рядов при обработке ежедневных данных о продажах:
import pandas as pd from fbprophet import Prophet # Read in data df = pd.read_csv("sales_data.csv") # Create prophet model model = Prophet() # Fit model to data model.fit(df) # Create future dataframe future_data = model.make_future_dataframe(periods=365) # Make predictions forecast = model.predict(future_data) # Print forecast dataframe print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']])
Можно также включить визуальные эффекты для прогнозируемых продаж, добавив следующие строки кода:
# Import visualization library import matplotlib.pyplot as plt # Plot predicted values model.plot(forecast) plt.show() # Plot predicted values with uncertainty intervals model.plot(forecast) plt.fill_between(forecast['ds'], forecast['yhat_lower'], forecast['yhat_upper'], color='pink') plt.show() # Plot component of the forecast model.plot_components(forecast) plt.show()
В выводе:
- Первая визуализация — «model.plot(forecast)» показывает прогнозируемые значения и исторические данные. Она дает общее представление о том, насколько хорошо модель соответствует данным.
- Вторая визуализация — «plt.fill_between(forecast[‘ds’], forecast[‘yhat_lower’], forecast[‘yhat_upper’], color=’pink’)» показывает прогнозируемые значения с интервалами неопределенности. Это позволит увидеть, как много в предсказаниях неопределенности.
- Третья визуализация — «model.plot_components(forecast)» показывает компоненты прогноза, такие как тенденция, сезонность и праздничные дни.
Заключение
Конечно перечисленные в обзоре скрипты Python дают лишь первоначальное представление о возможностях автоматизации «змеиного языка». Новые фреймворки и библиотеки для таких задач появляются почти каждый день. Для более глубокого погружения в тему, мы рекомендуем самостоятельно изучать официальную документацию к инструментам, а также специализированные источники, такие как шикарное руководство «Automate the Boring Stuff with Python».
А у вас есть любимые скрипты для автоматизации на Python?