В этой статье собрана коллекция из 25 потрясающих скриптов Python:
- 1. Конвертировать JSON в CSV
- 2. Генератор паролей
- 3. Поиск строки в файлах
- 4. Получить все ссылки с заданной веб-страницы
- 5. Водяной знак на изображении
- 6. Собрать и загрузить все изображения с веб-страницы
- 7. Уведомление о низком заряде батареи
- 8. Рассчитайте свой возраст
- 9. Папка организована для загрузки с различными категориями
- 10. Массовая рассылка электронных писем из CSV-файла
- 11. Получить IP-адрес и имя хоста веб-сайта
- 12. Изменение размера изображения
- 13. Извлекатель пароля WiFi
- 14. Скриншот веб-сайта
- 15. Разделить файлы на части
- 16. Зашифровать и расшифровывать тексты
- 17. Скриншот экрана через регулярные промежутки времени
- 18. Конвертер десятичной системы в двоичную
- 19. Простое Todo CLI-приложение
- 20. Конвертер валют
- 21. Создание простого секундомера
- 22. Код Python для создания zip-архива
- 23. Поиск рейтинга IMDB
- 24. Веб-скрейпинг комментариев Youtube
- 25. Код для преобразования текста в речь с использованием gTTS
1. Конвертировать JSON в CSV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import json if __name__ == '__main__': try: # Открываем файл 'input.json' для чтения with open('input.json', 'r') as f: data = json.loads(f.read()) # Формируем строку 'output' из ключей первого объекта в 'data' output = ','.join([*data[0]]) # Добавляем каждый объект из 'data' в строку 'output' в формате CSV for obj in data: output += f'\n{obj["Name"]},{obj["age"]},{obj["birthyear"]}' # Открываем файл 'output.csv' для записи и записываем в него строку 'output' with open('output.csv', 'w') as f: f.write(output) except Exception as ex: # Если происходит ошибка, выводим сообщение об ошибке print(f'Error: {str(ex)}') |
Этот код считывает данные из файла ‘input.json’, который содержит информацию в формате JSON. Затем он форматирует эти данные в формат CSV и записывает их в файл ‘output.csv’. Если происходит ошибка, выводится сообщение об ошибке.
2. Генератор паролей
1 2 3 4 5 6 | import random import string total = string.ascii_letters + string.digits + string.punctuation length = 16 password = "".join(random.sample(total, length)) print(password) |
Этот код генерирует случайный пароль длиной 16 символов. В переменной total содержатся все буквы (в верхнем и нижнем регистрах), цифры и знаки препинания. Затем с помощью функции random.sample выбираются случайные символы из total длиной 16, и они объединяются в строку password. Наконец, сгенерированный пароль выводится на экран.
3. Поиск строки в файлах
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import os text = input("input text : ") path = input("path : ") def getfiles(path): f = 0 os.chdir(path) # Изменяем текущую директорию на заданную 'path' files = os.listdir() # Получаем список файлов и папок в текущей директории for file_name in files: abs_path = os.path.abspath(file_name) # Получаем абсолютный путь к файлу/папке if os.path.isdir(abs_path): # Проверяем, является ли объект директорией getfiles(abs_path) # Если да, рекурсивно вызываем функцию для этой директории if os.path.isfile(abs_path): # Проверяем, является ли объект файлом with open(file_name, "r") as f_n: if text in f_n.read(): f = 1 print(text + " found in ") final_path = os.path.abspath(file_name) print(final_path) return True if f == 0: print(text + " not found! ") return False getfiles(path) |
Этот код выполняет следующие действия:
- Запрашивает у пользователя ввод текста и пути.
- Определяет функцию
getfiles, которая рекурсивно обходит все файлы и папки в заданном пути. - Изменяет текущую директорию на заданный путь с помощью
os.chdir(path). - Получает список файлов и папок в текущей директории с помощью
os.listdir(). - Для каждого файла проверяет, содержит ли он искомый текст. Если да, выводит сообщение о нахождении текста и абсолютный путь к файлу.
- Если текст не найден во всех файлах, выводит сообщение о том, что текст не был найден.
4. Получить все ссылки с заданной веб-страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import requests as rq from bs4 import BeautifulSoup url = input("Enter Link: ") # Проверяем, содержит ли URL протокол "https" или "http", исходя из этого формируем запрос if "https" in url or "http" in url: data = rq.get(url) else: data = rq.get("https://" + url) soup = BeautifulSoup(data.text, "html.parser") # Создаем объект BeautifulSoup для парсинга HTML links = [] for link in soup.find_all("a"): # Находим все теги <a> в HTML-коде links.append(link.get("href")) # Получаем значения атрибута "href" и добавляем их в список # Записываем результат в файл "myLinks.txt" вместо вывода на экран # Если нужно перезаписать файл при каждом выполнении, измените 'a' на 'w' with open("myLinks.txt", 'a') as saved: print(links[:10], file=saved) |
Данный код выполняет парсинг HTML-кода веб-страницы и извлекает ссылки из тегов <a>. Полученные ссылки сохраняются в файл “myLinks.txt”.
5. Водяной знак на изображении
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import os from PIL import Image def watermark_photo(input_image_path, watermark_image_path, output_image_path): # Открываем базовое изображение base_image = Image.open(input_image_path) # Открываем изображение водяного знака и конвертируем его в режим с прозрачностью (RGBA) watermark = Image.open(watermark_image_path).convert("RGBA") # Изменяем размер водяного знака position = base_image.size newsize = (int(position[0] * 8 / 100), int(position[0] * 8 / 100)) watermark = watermark.resize(newsize) # Устанавливаем позицию водяного знака на изображении new_position = position[0] - newsize[0] - 20, position[1] - newsize[1] - 20 # Создаем новое прозрачное изображение transparent = Image.new(mode='RGBA', size=position, color=(0, 0, 0, 0)) # Вставляем базовое изображение transparent.paste(base_image, (0, 0)) # Вставляем изображение водяного знака transparent.paste(watermark, new_position, watermark) # Конвертируем прозрачное изображение в тот же режим цветности, что и базовое изображение image_mode = base_image.mode if image_mode == 'RGB': transparent = transparent.convert(image_mode) else: transparent = transparent.convert('P') # Сохраняем изображение с водяным знаком transparent.save(output_image_path, optimize=True, quality=100) print("Saving " + output_image_path + "...") |
Этот код выполняет операцию добавления водяного знака на изображение. Он открывает базовое изображение и изображение водяного знака, изменяет размер водяного знака, устанавливает его позицию на базовом изображении, создает новое прозрачное изображение и вставляет на него базовое изображение и водяной знак. Затем преобразует прозрачное изображение в тот же режим цветности, что и базовое изображение, и сохраняет итоговое изображение с водяным знаком.
6. Собрать и загрузить все изображения с веб-страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | from selenium import webdriver import requests as rq import os from bs4 import BeautifulSoup import time # Определяем путь к драйверу Chrome path = input("Enter Path: ") # Вводим URL-адрес url = input("Enter URL: ") # Папка для сохранения изображений output = "output" # Функция для получения HTML-кода страницы с помощью Selenium 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 # Функция для получения ссылок на изображения из HTML-кода 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 # Получаем HTML-код страницы 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!") |
Данный код использует библиотеки Selenium, requests и BeautifulSoup для автоматического скачивания изображений с веб-страницы. Он запрашивает у пользователя путь к драйверу Chrome и URL-адрес страницы. Затем, используя Selenium, он получает HTML-код страницы и извлекает ссылки на изображения. Код создает папку “output” для сохранения изображений, если ее не существует, и загружает каждое изображение в эту папку с уникальным именем. В конце выводится сообщение о завершении загрузки.
7. Уведомление о низком заряде батареи
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import psutil from pynotifier import Notification # Получаем информацию о заряде батареи battery = psutil.sensors_battery() plugged = battery.power_plugged percent = battery.percent # Проверяем, если заряд батареи меньше или равен 30 и батарея не подключена к источнику питания if percent <= 30 and plugged != True: # Отправляем уведомление о низком заряде батареи Notification( title="Battery Low", description=str(percent) + "% Battery remaining!!", duration=5 # Продолжительность отображения уведомления в секундах ).send() |
Данный код использует библиотеку psutil для получения информации о заряде батареи компьютера. Если заряд батареи составляет 30% или менее и компьютер не подключен к источнику питания, код отправляет уведомление с помощью библиотеки pynotifier. Уведомление содержит заголовок “Battery Low” и описание, указывающее процент оставшегося заряда батареи. Уведомление отображается в течение 5 секунд.
8. Рассчитайте свой возраст
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import time from calendar import isleap # Функция для определения високосного года def judge_leap_year(year): if isleap(year): return True else: return False # Функция для определения количества дней в каждом месяце def month_days(month, leap_year): if month in [1, 3, 5, 7, 8, 10, 12]: return 31 elif month in [4, 6, 9, 11]: return 30 elif month == 2 and leap_year: return 29 elif month == 2 and (not leap_year): return 28 name = input("Введите ваше имя: ") age = input("Введите ваш возраст: ") localtime = time.localtime(time.time()) year = int(age) month = year * 12 + localtime.tm_mon day = 0 begin_year = int(localtime.tm_year) - year end_year = begin_year + year # Рассчитываем количество дней for y in range(begin_year, end_year): if judge_leap_year(y): day += 366 else: day += 365 leap_year = judge_leap_year(localtime.tm_year) for m in range(1, localtime.tm_mon): day += month_days(m, leap_year) day += localtime.tm_mday print("Возраст %s составляет %d лет или " % (name, year), end="") print("%d месяцев или %d дней" % (month, day)) |
Данный код принимает ввод от пользователя, включающий имя и возраст. Затем он использует модули time и calendar для вычисления количества месяцев и дней, соответствующих указанному возрасту. Результат выводится на экран в формате “Возраст [имя] составляет [лет] лет или [месяцев] месяцев или [дней] дней”.
9. Папка организована для загрузки с различными категориями
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import os import shutil # Изменяем текущую рабочую директорию на "E:\downloads" os.chdir("E:\downloads") # Проверяем количество файлов в директории files = os.listdir() # Список расширений файлов для категоризации extensions = { "images": [".jpg", ".png", ".jpeg", ".gif"], "videos": [".mp4", ".mkv"], "music": [".mp3", ".wav"], "archives": [".zip", ".tgz", ".rar", ".tar"], "documents": [".pdf", ".docx", ".csv", ".xlsx", ".pptx", ".doc", ".ppt", ".xls"], "setup": [".msi", ".exe"], "programs": [".py", ".c", ".cpp", ".php", ".C", ".CPP"], "design": [".xd", ".psd"], } # Функция для определения категории файла на основе его расширения def get_category(file): for category, extensions_list in extensions.items(): for ext in extensions_list: if file.endswith(ext): return category return "others" # Итерируемся по каждому файлу for file in files: category = get_category(file) if category: try: shutil.move(file, "../download-sorting/" + category) except FileExistsError: print(file + " already exists.") else: try: shutil.move(file, "../download-sorting/others") except FileExistsError: print(file + " already exists.") |
Данный код сортирует файлы в директории “E:\downloads” в соответствующие поддиректории в зависимости от их расширения. Каждая категория файлов имеет свой список расширений в словаре extensions. Если файл не относится ни к одной из категорий, он перемещается в поддиректорию “others”.
10. Массовая рассылка электронных писем из CSV-файла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | import csv from email.message import EmailMessage import smtplib def get_credentials(filepath): with open("credentials.txt", "r") as f: email_address = f.readline() email_pass = f.readline() return (email_address, email_pass) def login(email_address, email_pass, s): s.ehlo() s.starttls() s.ehlo() s.login(email_address, email_pass) print("Logged in successfully.") def send_mail(): s = smtplib.SMTP("smtp.gmail.com", 587) email_address, email_pass = get_credentials("./credentials.txt") login(email_address, email_pass, s) subject = "Welcome to Python" body = """Python is an interpreted, high-level, general-purpose programming language.\n Created by Guido van Rossum and first released in 1991, Python's design philosophy emphasizes code readability\n with its notable use of significant whitespace""" message = EmailMessage() message.set_content(body) message['Subject'] = subject with open("emails.csv", newline="") as csvfile: spamreader = csv.reader(csvfile, delimiter=" ", quotechar="|") for email in spamreader: s.send_message(email_address, email[0], message) print("Sent to " + email[0]) s.quit() print("Emails sent successfully.") if __name__ == "__main__": send_mail() |
Данный код отправляет электронные письма с заданным текстом и темой для адресов, указанных в файле “emails.csv”. Почтовые учетные данные (адрес электронной почты и пароль) читаются из файла “credentials.txt”. Код использует библиотеку smtplib для установки соединения с SMTP-сервером и отправки писем. Каждое письмо отправляется от имени отправителя (адрес электронной почты из файла credentials.txt) на адрес получателя из файла emails.csv.
11. Получить IP-адрес и имя хоста веб-сайта
1 2 3 4 5 6 7 8 9 10 11 | import socket def get_hostname_IP(): hostname = input("Введите домен сайта: ") try: print(f'Hostname: {hostname}') # Выводим имя хоста на экран print(f'IP: {socket.gethostbyname(hostname)}') # Получаем и выводим IP-адрес except socket.gaierror as error: print(f'Invalid Hostname, error raised: {error}') # Обрабатываем ошибку, если введенный адрес недействителен get_hostname_IP() |
Этот код позволяет получить IP-адрес и имя хоста для указанного веб-сайта. Пользователь будет запрошен ввести адрес веб-сайта (URL), и затем код использует функцию socket.gethostbyname() для получения IP-адреса и выводит его на экран. Если введенный адрес недействителен или не найден, будет выведено сообщение об ошибке.
12. Изменение размера изображения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | from tqdm import tqdm # Импорт библиотеки для отображения прогресса from PIL import Image # Импорт библиотеки для работы с изображениями import os # Импорт модуля для работы с операционной системой from time import sleep # Импорт функции для добавления паузы def Resize_image(size, image): if os.path.isfile(image): # Проверка, является ли файл существующим файлом try: im = Image.open(image) # Открытие изображения im.thumbnail(size, Image.ANTIALIAS) # Изменение размера изображения im.save("resize/" + str(image) + ".jpg") # Сохранение измененного изображения except Exception as ex: # Обработка возможных исключений print(f"Error: {str(ex)} to {image}") path = input("Enter Path to images: ") # Ввод пути к изображениям size = input("Size Height, Width: ") # Ввод размера изображений size = tuple(map(int, size.split(","))) # Преобразование введенного размера в кортеж os.chdir(path) # Изменение текущей директории list_images = os.listdir(path) # Получение списка файлов в директории if "resize" not in list_images: # Проверка наличия директории для измененных изображений os.mkdir("resize") # Создание директории for image in tqdm(list_images, desc="Resizing Images"): # Цикл по списку файлов с отображением прогресса Resize_image(size, image) # Изменение размера изображения sleep(0.1) # Пауза в цикле для отображения прогресса print("Resizing Completed!") # Вывод сообщения о завершении изменения размеров |
Данный код выполняет операцию изменения размера изображений. Он позволяет пользователю указать путь к набору изображений и требуемый размер. Затем код обрабатывает каждое изображение в указанной директории, изменяет его размер в соответствии с заданными параметрами и сохраняет измененные изображения в новой директории “resize”. Прогресс выполнения операции изменения размера отображается с помощью индикатора прогресса tqdm. По завершении операции выводится сообщение о ее завершении.
13. Извлекатель пароля WiFi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import subprocess # Получение списка всех Wi-Fi профилей data = ( subprocess.check_output(["netsh", "wlan", "show", "profiles"]) .decode("utf-8") .split("\n") ) profiles = [i.split(":")[1][1:-1] for i in data if "All User Profile" in i] # Для каждого профиля получаем пароль (если доступно) и выводим результаты for i in profiles: # Получение пароля для каждого профиля results = ( subprocess .check_output(["netsh", "wlan", "show", "profile", i, "key=clear"]) .decode("utf-8") .split("\n") ) results = [b.split(":")[1][1:-1] for b in results if "Key Content" in b] # Вывод результатов на экран try: print("{:<30}| {:<}".format(i, results[0])) except IndexError: print("{:<30}| {:<}".format(i, "")) |
Данный код позволяет получить и отобразить список сохраненных Wi-Fi профилей и соответствующие пароли в операционной системе Windows. Он использует команды netsh wlan для извлечения информации о профилях Wi-Fi. Сначала код получает список всех профилей, а затем для каждого профиля получает соответствующий пароль. Результаты выводятся на экран, где каждый профиль сопровождается своим паролем, если он доступен.
14. Скриншот веб-сайта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import sys from selenium import webdriver from selenium.webdriver.chrome.options import Options import chromedriver_binary # Получение имени скрипта script_name = sys.argv[0] # Настройка веб-драйвера Selenium options = Options() options.add_argument('--headless') driver = webdriver.Chrome(options=options) try: # Получение URL из аргументов командной строки url = sys.argv[1] # Открытие страницы и создание скриншота driver.get(url) page_width = driver.execute_script('return document.body.scrollWidth') page_height = driver.execute_script('return document.body.scrollHeight') driver.set_window_size(page_width, page_height) driver.save_screenshot('screenshot.png') driver.quit() print("SUCCESS") except IndexError: print('Usage: %s URL' % script_name) |
Данный код выполняет скриншот страницы, используя браузер Chrome и Selenium. Он принимает URL страницы в качестве аргумента командной строки и сохраняет скриншот в файл screenshot.png. Сначала код настраивает веб-драйвер Chrome и создает экземпляр драйвера. Затем он открывает указанный URL, определяет размер страницы и устанавливает размер окна браузера соответствующим образом. После этого он создает скриншот страницы и сохраняет его в файл. Если URL не указан в аргументах командной строки, выводится сообщение о правильном использовании скрипта.
15. Разделить файлы на части
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import sys import os import shutil import pandas as pd class Split_Files: ''' Класс для разделения файлов ''' def __init__(self, filename, split_number): ''' Получение имени файла и индекса разделения Инициализация директории для вывода, если она существует, то она очищается. Получение расширения файла ''' self.file_name = filename self.directory = "file_split" self.split = int(split_number) if os.path.exists(self.directory): shutil.rmtree(self.directory) os.mkdir(self.directory) if self.file_name.endswith('.txt'): self.file_extension = '.txt' else: self.file_extension = '.csv' self.file_number = 1 def split_data(self): ''' Разделение входного файла csv/txt в соответствии с указанным индексом ''' data = pd.read_csv(self.file_name, header=None) data.index += 1 split_frame = pd.DataFrame() output_file = f"{self.directory}/split_file{self.file_number}{self.file_extension}" for i in range(1, len(data)+1): split_frame = split_frame.append(data.iloc[i-1]) if i % self.split == 0: output_file = f"{self.directory}/split_file{self.file_number}{self.file_extension}" if self.file_extension == '.txt': split_frame.to_csv(output_file, header=False, index=False, sep=' ') else: split_frame.to_csv(output_file, header=False, index=False) split_frame.drop(split_frame.index, inplace=True) self.file_number += 1 if not split_frame.empty: output_file = f"{self.directory}/split_file{self.file_number}{self.file_extension}" split_frame.to_csv(output_file, header=False, index=False) if __name__ == '__main__': file, split_number = sys.argv[1], sys.argv[2] sp = Split_Files(file, split_number) sp.split_data() |
Данный код выполняет разделение файла на несколько частей. Он принимает имя файла и индекс разделения в качестве аргументов командной строки. Код создает класс Split_Files, который инициализирует переменные, такие как имя файла, директория для сохранения разделенных файлов, число разделения и расширение файла. Затем код выполняет разделение данных файла на указанное число частей. Разделенные части сохраняются в отдельные файлы в указанной директории. Если расширение файла – .txt, данные сохраняются с разделителем пробела, в противном случае данные сохраняются без заголовков. Каждый разделенный файл получает имя в формате split_file<номер_файла>.<расширение>.
16. Зашифровать и расшифровывать тексты
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | from Crypto.Cipher import AES from Crypto import Random from binascii import b2a_hex import sys # Получаем открытый текст plain_text = sys.argv[1] # Длина ключа должна быть 16 (AES-128), 24 (AES-192) или 32 (AES-256) байтов. key = b'this is a 16 key' # Генерируем неповторяющийся вектор инициализации (IV) длиной, # равной размеру блока AES. iv = Random.new().read(AES.block_size) # Инициализируем объект AES с использованием ключа и вектора инициализации (IV), # используя режим MODE_CFB. mycipher = AES.new(key, AES.MODE_CFB, iv) # Добавляем вектор инициализации (IV) в начало зашифрованного шифротекста # и передаем их вместе. ciphertext = iv + mycipher.encrypt(plain_text.encode()) # Для расшифровки используем ключ и вектор инициализации (IV), # чтобы создать новый объект AES. mydecrypt = AES.new(key, AES.MODE_CFB, ciphertext[:16]) # Используем новый объект AES для расшифровки зашифрованного шифротекста. decrypttext = mydecrypt.decrypt(ciphertext[16:]) # Выводим результаты file_out = open("encrypted.bin", "wb") file_out.write(ciphertext[16:]) file_out.close() print("Ключ k: ", key) print("IV: ", b2a_hex(ciphertext)[:16]) print("Зашифрованные данные: ", b2a_hex(ciphertext)[16:]) print("Расшифрованные данные: ", decrypttext.decode()) |
Данный код выполняет шифрование и расшифровку текста с использованием алгоритма AES (Advanced Encryption Standard). Код принимает открытый текст в качестве аргумента командной строки. Затем генерируется ключ и вектор инициализации (IV), инициализируется объект AES в режиме CFB (Cipher Feedback), и производится шифрование текста. Зашифрованный шифротекст сохраняется в файл “encrypted.bin”. Затем код выполняет расшифровку зашифрованного шифротекста с использованием ключа и вектора инициализации. Расшифрованный текст выводится на экран.
17. Скриншот экрана через регулярные промежутки времени
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import os import argparse import pyautogui import time # Создание парсера аргументов командной строки parser = argparse.ArgumentParser() # Определение аргументов parser.add_argument("-p", "--path", help="абсолютный путь для сохранения скриншотов", default=r"./images") parser.add_argument("-t", "--type", help="h (в часах) или m (в минутах) или s (в секундах)", default='h') parser.add_argument("-f", "--frequency", help="частота создания скриншотов в час/мин/сек", default=1, type=int) # Получение аргументов из командной строки args = parser.parse_args() # Расчет временного интервала между скриншотами в секундах sec = 0. if args.type == 'h': sec = 60 * 60 / args.frequency elif args.type == 'm': sec = 60 / args.frequency # Установка минимального значения временного интервала в 1 секунду if sec < 1.: sec = 1. # Создание директории для сохранения скриншотов, если она не существует if os.path.isdir(args.path) != True: os.mkdir(args.path) try: while True: t = time.localtime() current_time = time.strftime("%H_%M_%S", t) file = current_time + ".jpg" image = pyautogui.screenshot(os.path.join(args.path, file)) print(f"{file} успешно сохранен.\n") time.sleep(sec) except KeyboardInterrupt: print("Программа завершена по запросу пользователя.") |
Данный код выполняет автоматическое создание скриншотов экрана с определенной частотой. Код использует модули os, argparse, pyautogui и time. Аргументы командной строки позволяют настроить путь для сохранения скриншотов, частоту создания скриншотов и единицу измерения временного интервала. Код создает директорию для сохранения скриншотов, если она не существует, а затем в бесконечном цикле создает скриншоты с использованием модуля pyautogui и сохраняет их в указанную директорию. Временной интервал между скриншотами определяется на основе указанной частоты и единицы измерения времени. Программа может быть прервана пользователем при помощи комбинации клавиш “Ctrl+C”.
18. Конвертер десятичной системы в двоичную
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | try: # Вывод меню с выбором опции menu = int(input("Выберите опцию:\n 1. Десятичное в двоичное\n 2. Двоичное в десятичное\n Опция: ")) # Проверка выбранной опции на валидность if menu < 1 or menu > 2: raise ValueError # Обработка выбранной опции if menu == 1: # Ввод десятичного числа dec = int(input("Введите ваше десятичное число:\nДесятичное: ")) # Преобразование десятичного числа в двоичное и вывод результата print("Двоичное: {}".format(bin(dec)[2:])) elif menu == 2: # Ввод двоичного числа binary = input("Введите ваше двоичное число:\nДвоичное: ") # Преобразование двоичного числа в десятичное и вывод результата print("Десятичное: {}".format(int(binary, 2))) except ValueError: # В случае некорректного выбора опции выводится сообщение об ошибке print("Пожалуйста, выберите допустимую опцию.") |
Данный код представляет собой простое меню для конвертации чисел между десятичной и двоичной системами счисления. Пользователю предлагается выбрать опцию: десятичное в двоичное или двоичное в десятичное. Затем в зависимости от выбранной опции происходит ввод соответствующего числа (десятичного или двоичного) и осуществляется преобразование. В случае выбора некорректной опции выводится сообщение об ошибке.
19. Простое Todo CLI-приложение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | import click @click.group() @click.pass_context def todo(ctx): '''Простое CLI-приложение для списка задач''' ctx.ensure_object(dict) # Открываем файл todo.txt – первая строка содержит последний идентификатор, остальные строки содержат задачи и их идентификаторы with open('./todo.txt') as f: content = f.readlines() # Переносим данные из файла todo.txt в контекст ctx.obj['LATEST'] = int(content[:1][0]) ctx.obj['TASKS'] = {en.split('```')[0]:en.split('```')[1][:-1] for en in content[1:]} @todo.command() @click.pass_context def tasks(ctx): '''Вывод задач''' if ctx.obj['TASKS']: click.echo('ВАШИ ЗАДАЧИ\n**********') # Перебираем все задачи, хранящиеся в контексте for i, task in ctx.obj['TASKS'].items(): click.echo('• ' + task + ' (ID: ' + i + ')') click.echo('') else: click.echo('Задач пока нет! Используйте команду ADD для добавления задачи.\n') @todo.command() @click.pass_context @click.option('-add', '--add_task', prompt='Введите задачу для добавления') def add(ctx, add_task): '''Добавление задачи''' if add_task: # Добавляем задачу в список в контексте ctx.obj['TASKS'][ctx.obj['LATEST']] = add_task click.echo('Добавлена задача "' + add_task + '" с ID ' + str(ctx.obj['LATEST'])) # Открываем файл todo.txt и записываем текущий индекс и задачи с их идентификаторами (разделенными "```") curr_ind = [str(ctx.obj['LATEST'] + 1)] tasks = [str(i) + '```' + t for (i, t) in ctx.obj['TASKS'].items()] with open('./todo.txt', 'w') as f: f.writelines(['%s\n' % en for en in curr_ind + tasks]) @todo.command() @click.pass_context @click.option('-fin', '--fin_taskid', prompt='Введите ID задачи для завершения', type=int) def done(ctx, fin_taskid): '''Удаление задачи по ID''' # Находим задачу с указанным идентификатором if str(fin_taskid) in ctx.obj['TASKS'].keys(): task = ctx.obj['TASKS'][str(fin_taskid)] # Удаляем задачу из списка задач в контексте del ctx.obj['TASKS'][str(fin_taskid)] click.echo('Завершена и удалена задача "' + task + '" с ID ' + str(fin_taskid)) # Открываем файл todo.txt и записываем текущий индекс и задачи с их идентификаторами (разделенными "```") if ctx.obj['TASKS']: curr_ind = [str(ctx.obj['LATEST'] + 1)] tasks = [str(i) + '```' + t for (i, t) in ctx.obj['TASKS'].items()] with open('./todo.txt', 'w') as f: f.writelines(['%s\n' % en for en in curr_ind + tasks]) else: # Сбрасываем индекс на 0, если список пуст with open('./todo.txt', 'w') as f: f.writelines([str(0) + '\n']) else: click.echo('Ошибка: нет задачи с ID ' + str(fin_taskid)) if __name__ == '__main__': todo() |
Данный код представляет собой простое CLI-приложение для управления списком задач. Он использует библиотеку Click для создания команд и подкоманд. Приложение позволяет добавлять задачи, выводить список задач и удалять задачи по их идентификаторам. Данные о задачах сохраняются в файле todo.txt. При запуске приложения, оно загружает данные из файла и хранит их в контексте. Затем пользователь может выбрать нужную команду (например, tasks для просмотра задач или add для добавления новой задачи) и взаимодействовать с приложением через командную строку. После выполнения операций над задачами, обновленные данные сохраняются в файле todo.txt.
20. Конвертер валют
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | import requests import json import sys from pprint import pprint # The below 4 lines bring out the value of currency from the api at fixer.io. I had to register there, the key is unique to me. url = "http://data.fixer.io/api/latest?access_key=33ec7c73f8a4eb6b9b5b5f95118b2275" data = requests.get(url).text data2 = json.loads(data) #brings whether request was successful,timestamp etc fx = data2["rates"] currencies = [ "AED : Emirati Dirham,United Arab Emirates Dirham", "AFN : Afghan Afghani,Afghanistan Afghani", "ALL : Albanian Lek,Albania Lek", "AMD : Armenian Dram,Armenia Dram", "ANG : Dutch Guilder,Netherlands Antilles Guilder,Bonaire,Curaçao,Saba,Sint Eustatius,Sint Maarten", "AOA : Angolan Kwanza,Angola Kwanza", "ARS : Argentine Peso,Argentina Peso,Islas Malvinas", "AUD : Australian Dollar,Australia Dollar,Christmas Island,Cocos (Keeling) Islands,Norfolk Island,Ashmore and Cartier Islands,Australian Antarctic Territory,Coral Sea Islands,Heard Island,McDonald Islands,Kiribati,Nauru", "AWG : Aruban or Dutch Guilder,Aruba Guilder", "AZN : Azerbaijan Manat,Azerbaijan Manat", "BAM : Bosnian Convertible Mark,Bosnia and Herzegovina Convertible Mark", "BBD : Barbadian or Bajan Dollar,Barbados Dollar", "BDT : Bangladeshi Taka,Bangladesh Taka", "BGN : Bulgarian Lev,Bulgaria Lev", "BHD : Bahraini Dinar,Bahrain Dinar", "BIF : Burundian Franc,Burundi Franc", "BMD : Bermudian Dollar,Bermuda Dollar", "BND : Bruneian Dollar,Brunei Darussalam Dollar", "BOB : Bolivian Bolíviano,Bolivia Bolíviano", "BRL : Brazilian Real,Brazil Real", "BSD : Bahamian Dollar,Bahamas Dollar", "BTC : Bitcoin,BTC, XBT", "BTN : Bhutanese Ngultrum,Bhutan Ngultrum", "BWP : Botswana Pula,Botswana Pula", "BYN : Belarusian Ruble,Belarus Ruble", "BYR : Belarusian Ruble,Belarus Ruble", "BZD : Belizean Dollar,Belize Dollar", "CAD : Canadian Dollar,Canada Dollar", "CDF : Congolese Franc,Congo/Kinshasa Franc", "CHF : Swiss Franc,Switzerland Franc,Liechtenstein,Campione d'Italia,Büsingen am Hochrhein", "CLF : Chilean Unit of Account", "CLP : Chilean Peso,Chile Peso", "CNY : Chinese Yuan Renminbi,China Yuan Renminbi", "COP : Colombian Peso,Colombia Peso", "CRC : Costa Rican Colon,Costa Rica Colon", "CUC : Cuban Convertible Peso,Cuba Convertible Peso", "CUP : Cuban Peso,Cuba Peso", "CVE : Cape Verdean Escudo,Cape Verde Escudo", "CZK : Czech Koruna,Czech Republic Koruna", "DJF : Djiboutian Franc,Djibouti Franc", "DKK : Danish Krone,Denmark Krone,Faroe Islands,Greenland", "DOP : Dominican Peso,Dominican Republic Peso", "DZD : Algerian Dinar,Algeria Dinar", "EGP : Egyptian Pound,Egypt Pound,Gaza Strip", "ERN : Eritrean Nakfa,Eritrea Nakfa", "ETB : Ethiopian Birr,Ethiopia Birr,Eritrea", "EUR : Euro,Euro Member Countries,Andorra,Austria,Azores,Baleares (Balearic Islands),Belgium,Canary Islands,Cyprus,Finland,France,French Guiana,French Southern Territories,Germany,Greece,Guadeloupe,Holland (Netherlands),Holy See (Vatican City),Ireland (Eire),Italy,Luxembourg,Madeira Islands,Malta,Monaco,Montenegro,Netherlands", "FJD : Fijian Dollar,Fiji Dollar", "FKP : Falkland Island Pound,Falkland Islands (Malvinas) Pound", "GBP : British Pound,United Kingdom Pound,United Kingdom (UK),England,Northern Ireland,Scotland,Wales,Falkland Islands,Gibraltar,Guernsey,Isle of Man,Jersey,Saint Helena and Ascension,South Georgia and the South Sandwich Islands,Tristan da Cunha", "GEL : Georgian Lari,Georgia Lari", "GGP : Guernsey Pound,Guernsey Pound", "GHS : Ghanaian Cedi,Ghana Cedi", "GIP : Gibraltar Pound,Gibraltar Pound", "GMD : Gambian Dalasi,Gambia Dalasi", "GNF : Guinean Franc,Guinea Franc", "GTQ : Guatemalan Quetzal,Guatemala Quetzal", "GYD : Guyanese Dollar,Guyana Dollar", "HKD : Hong Kong Dollar,Hong Kong Dollar", "HNL : Honduran Lempira,Honduras Lempira", "HRK : Croatian Kuna,Croatia Kuna", "HTG : Haitian Gourde,Haiti Gourde", "HUF : Hungarian Forint,Hungary Forint", "IDR : Indonesian Rupiah,Indonesia Rupiah,East Timor", "ILS : Israeli Shekel,Israel Shekel,Palestinian Territories", "IMP : Isle of Man Pound,Isle of Man Pound", "INR : Indian Rupee,India Rupee,Bhutan,Nepal", "IQD : Iraqi Dinar,Iraq Dinar", "IRR : Iranian Rial,Iran Rial", "ISK : Icelandic Krona,Iceland Krona", "JEP : Jersey Pound,Jersey Pound", "JMD : Jamaican Dollar,Jamaica Dollar", "JOD : Jordanian Dinar,Jordan Dinar", "JPY : Japanese Yen,Japan Yen", "KES : Kenyan Shilling,Kenya Shilling", "KGS : Kyrgyzstani Som,Kyrgyzstan Som", "KHR : Cambodian Riel,Cambodia Riel", "KMF : Comorian Franc,Comorian Franc", "KPW : North Korean Won,Korea (North) Won", "KRW : South Korean Won,Korea (South) Won", "KWD : Kuwaiti Dinar,Kuwait Dinar", "KYD : Caymanian Dollar,Cayman Islands Dollar", "KZT : Kazakhstani Tenge,Kazakhstan Tenge", "LAK : Lao Kip,Laos Kip", "LBP : Lebanese Pound,Lebanon Pound", "LKR : Sri Lankan Rupee,Sri Lanka Rupee", "LRD : Liberian Dollar,Liberia Dollar", "LSL : Basotho Loti,Lesotho Loti", "LTL : Lithuanian litas", "LVL : Latvia Lats", "LYD : Libyan Dinar,Libya Dinar", "MAD : Moroccan Dirham,Morocco Dirham,Western Sahara", "MDL : Moldovan Leu,Moldova Leu", "MGA : Malagasy Ariary,Madagascar Ariary", "MKD : Macedonian Denar,Macedonia Denar", "MMK : Burmese Kyat,Myanmar (Burma) Kyat", "MNT : Mongolian Tughrik,Mongolia Tughrik", "MOP : Macau Pataca,Macau Pataca", "MRU : Mauritanian Ouguiya,Mauritania Ouguiya", "MUR : Mauritian Rupee,Mauritius Rupee", "MVR : Maldivian Rufiyaa,Maldives (Maldive Islands) Rufiyaa", "MWK : Malawian Kwacha,Malawi Kwacha", "MXN : Mexican Peso,Mexico Peso", "MYR : Malaysian Ringgit,Malaysia Ringgit", "MZN : Mozambican Metical,Mozambique Metical", "NAD : Namibian Dollar,Namibia Dollar", "NGN : Nigerian Naira,Nigeria Naira", "NIO : Nicaraguan Cordoba,Nicaragua Cordoba", "NOK : Norwegian Krone,Norway Krone,Bouvet Island,Svalbard,Jan Mayen,Queen Maud Land,Peter I Island", "NPR : Nepalese Rupee,Nepal Rupee,India (unofficially near India-Nepal border)", "NZD : New Zealand Dollar,New Zealand Dollar,Cook Islands,Niue,Pitcairn Islands,Tokelau", "OMR : Omani Rial,Oman Rial", "PAB : Panamanian Balboa,Panama Balboa", "PEN : Peruvian Sol,Peru Sol", "PGK : Papua New Guinean Kina,Papua New Guinea Kina", "PHP : Philippine Peso,Philippines Peso", "PKR : Pakistani Rupee,Pakistan Rupee", "PLN : Polish Zloty,Poland Zloty", "PYG : Paraguayan Guarani,Paraguay Guarani", "QAR : Qatari Riyal,Qatar Riyal", "RON : Romanian Leu,Romania Leu", "RSD : Serbian Dinar,Serbia Dinar", "RUB : Russian Ruble,Russia Ruble,Tajikistan,Abkhazia,South Ossetia", "RWF : Rwandan Franc,Rwanda Franc", "SAR : Saudi Arabian Riyal,Saudi Arabia Riyal", "SBD : Solomon Islander Dollar,Solomon Islands Dollar", "SCR : Seychellois Rupee,Seychelles Rupee", "SDG : Sudanese Pound,Sudan Pound", "SEK : Swedish Krona,Sweden Krona", "SGD : Singapore Dollar,Singapore Dollar", "SHP : Saint Helenian Pound,Saint Helena Pound", "SLL : Sierra Leonean Leone,Sierra Leone Leone", "SOS : Somali Shilling,Somalia Shilling", "SRD : Surinamese Dollar,Suriname Dollar", "STN : Sao Tomean Dobra,São Tomé and Príncipe Dobra", "SVC : Salvadoran Colon,El Salvador Colon", "SYP : Syrian Pound,Syria Pound", "SZL : Swazi Lilangeni,eSwatini Lilangeni", "THB : Thai Baht,Thailand Baht", "TJS : Tajikistani Somoni,Tajikistan Somoni", "TMT : Turkmenistani Manat,Turkmenistan Manat", "TND : Tunisian Dinar,Tunisia Dinar", "TOP : Tongan Pa'anga,Tonga Pa'anga", "TRY : Turkish Lira,Turkey Lira,North Cyprus", "TTD : Trinidadian Dollar,Trinidad and Tobago Dollar,Trinidad,Tobago", "TWD : Taiwan New Dollar,Taiwan New Dollar", "TZS : Tanzanian Shilling,Tanzania Shilling", "UAH : Ukrainian Hryvnia,Ukraine Hryvnia", "UGX : Ugandan Shilling,Uganda Shilling", "USD : US Dollar,United States Dollar,America,American Samoa,American Virgin Islands,British Indian Ocean Territory,British Virgin Islands,Ecuador,El Salvador,Guam,Haiti,Micronesia,Northern Mariana Islands,Palau,Panama,Puerto Rico,Turks and Caicos Islands,United States Minor Outlying Islands,Wake Island,East Timor", "UYU : Uruguayan Peso,Uruguay Peso", "UZS : Uzbekistani Som,Uzbekistan Som", "VEF : Venezuelan Bolívar,Venezuela Bolívar", "VND : Vietnamese Dong,Viet Nam Dong", "VUV : Ni-Vanuatu Vatu,Vanuatu Vatu", "WST : Samoan Tala,Samoa Tala", "XAF : Central African CFA Franc BEAC,Communauté Financière Africaine (BEAC) CFA Franc BEAC,Cameroon,Central African Republic,Chad,Congo/Brazzaville,Equatorial Guinea,Gabon", "XAG : Silver Ounce,Silver", "XAU : Gold Ounce,Gold", "XCD : East Caribbean Dollar,East Caribbean Dollar,Anguilla,Antigua and Barbuda,Dominica,Grenada,The Grenadines and Saint Vincent,Montserrat", "XDR : IMF Special Drawing Rights,International Monetary Fund (IMF) Special Drawing Rights", "XOF : CFA Franc,Communauté Financière Africaine (BCEAO) Franc,Benin,Burkina Faso,Ivory Coast,Guinea-Bissau,Mali,Niger,Senegal,Togo", "XPF : CFP Franc,Comptoirs Français du Pacifique (CFP) Franc,French Polynesia,New Caledonia,Wallis and Futuna Islands", "YER : Yemeni Rial,Yemen Rial", "ZAR : South African Rand,South Africa Rand,Lesotho,Namibia", "ZMK : Zambian Kwacha,Zambia Kwacha", "ZMW : Zambian Kwacha,Zambia Kwacha", "ZWL : Zimbabwean Dollar,Zimbabwe Dollar", ] # The below function calculates the actual conversion def function1(): query = input( "Please specify the amount of currency to convert, from currency, to currency (with space in between).\nPress SHOW to see list of currencies available. \nPress Q to quit. \n" ) if query == "Q": sys.exit() elif query == "SHOW": pprint(currencies) function1() else: qty, fromC, toC = query.split(" ") fromC = fromC.upper() toC = toC.upper() qty = float(round(int(qty), 2)) amount = round(qty * fx[toC] / fx[fromC], 2) print(f"{qty} of currency {fromC} amounts to {amount} of currency {toC} today") try: function1() except KeyError: print("You seem to have inputted wrongly, retry!") function1() |
Этот код является примером CLI-приложения на языке программирования Python. CLI (Command Line Interface) означает интерфейс командной строки, который позволяет взаимодействовать с программой через команды, вводимые в командной строке.
В данном примере, приложение запрашивает у пользователя данные о конверсии валюты. Оно использует стороннюю библиотеку requests для выполнения HTTP-запроса к веб-сервису fixer.io, откуда получает информацию о курсах валют. Затем оно предлагает пользователю ввести сумму валюты, исходную валюту и целевую валюту для конверсии.
Приложение также содержит список доступных валют currencies, из которого пользователь может выбрать исходную и целевую валюты. Если пользователь вводит “SHOW”, то приложение выводит список доступных валют. Если пользователь вводит “Q”, то программа завершается.
Функция function1() выполняет фактическое преобразование валюты на основе введенных данных и печатает результат.
21. Создание простого секундомера
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import tkinter as Tkinter from datetime import datetime counter = 0 running = False def counter_label(label): def count(): if running: global counter # To manage the intial delay. if counter == 0: display = 'Ready!' else: tt = datetime.utcfromtimestamp(counter) string = tt.strftime('%H:%M:%S') display = string label['text'] = display # label.after(arg1, arg2) delays by # first argument given in milliseconds # and then calls the function given as second argument. # Generally like here we need to call the # function in which it is present repeatedly. # Delays by 1000ms=1 seconds and call count again. label.after(1000, count) counter += 1 # Triggering the start of the counter. count() # start function of the stopwatch def Start(label): global running running = True counter_label(label) start['state'] = 'disabled' stop['state'] = 'normal' reset['state'] = 'normal' # Stop function of the stopwatch def Stop(): global running start['state'] = 'normal' stop['state'] = 'disabled' reset['state'] = 'normal' running = False # Reset function of the stopwatch def Reset(label): global counter counter = 0 # If reset is pressed after pressing stop. if not running: reset['state'] = 'disabled' label['text'] = '00:00:00' # If reset is pressed while the stopwatch is running. else: label['text'] = '00:00:00' root = Tkinter.Tk() root.title("Stopwatch") # Fixing the window size. root.minsize(width=250, height=70) label = Tkinter.Label(root, text='Ready!', fg='black', font='Verdana 30 bold') label.pack() f = Tkinter.Frame(root) start = Tkinter.Button(f, text='Start', width=6, command=lambda: Start(label)) stop = Tkinter.Button(f, text='Stop', width=6, state='disabled', command=Stop) reset = Tkinter.Button(f, text='Reset', width=6, state='disabled', command=lambda: Reset(label)) f.pack(anchor='center', pady=5) start.pack(side='left') stop.pack(side='left') reset.pack(side='left') root.mainloop() |
Данный код представляет собой реализацию простого секундомера на языке Python с использованием библиотеки Tkinter. При запуске код создает окно, в котором отображается метка с текущим временем или сообщением “Ready!”, и три кнопки: “Start”, “Stop” и “Reset”.
Нажатие кнопки “Start” запускает секундомер, который начинает отсчет времени, обновляя метку каждую секунду. Кнопка “Stop” останавливает отсчет, а кнопка “Reset” сбрасывает секундомер и возвращает метку в исходное состояние.
Код содержит несколько функций: “counter_label” для обновления метки с отображением времени, “Start” для запуска секундомера, “Stop” для остановки секундомера и “Reset” для сброса секундомера.
22. Код Python для создания zip-архива
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import zipfile import sys import os # compress file function def zip_file(file_path): compress_file = zipfile.ZipFile(file_path + '.zip', 'w') compress_file.write(path, compress_type=zipfile.ZIP_DEFLATED) compress_file.close() # Declare the function to return all file paths of the particular directory def retrieve_file_paths(dir_name): # setup file paths variable file_paths = [] # Read all directory, subdirectories and file lists for root, directories, files in os.walk(dir_name): for filename in files: # Create the full file path by using os module. file_path = os.path.join(root, filename) file_paths.append(file_path) # return all paths return file_paths def zip_dir(dir_path, file_paths): # write files and folders to a zipfile compress_dir = zipfile.ZipFile(dir_path + '.zip', 'w') with compress_dir: # write each file separately for file in file_paths: compress_dir.write(file) if __name__ == "__main__": path = sys.argv[1] if os.path.isdir(path): files_path = retrieve_file_paths(path) # print the list of files to be zipped print('The following list of files will be zipped:') for file_name in files_path: print(file_name) zip_dir(path, files_path) elif os.path.isfile(path): print('The %s will be zipped:' % path) zip_file(path) else: print('a special file(socket,FIFO,device file), please input file or dir') |
В основной части кода осуществляется проверка, является ли указанный путь директорией или файлом. Если это директория, то получаются все файлы в ней и ее поддиректориях с помощью функции retrieve_file_paths, после чего происходит создание zip-архива для этой директории с помощью функции zip_dir. Если же указанный путь является файлом, то создается zip-архив только для этого файла с помощью функции zip_file. Если указанный путь не является ни файлом, ни директорией, выводится соответствующее сообщение об ошибке.
23. Поиск рейтинга IMDB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | from bs4 import BeautifulSoup import requests import pandas as pd import os # Setting up session s = requests.session() # List contaiting all the films for which data has to be scraped from IMDB films = [] # Lists contaiting web scraped data names = [] ratings = [] genres = [] # Define path where your films are present # For eg: "/Users/utkarsh/Desktop/films" path = input("Enter the path where your films are: ") # Films with extensions filmswe = os.listdir(path) for film in filmswe: # Append into my films list (without extensions) films.append(os.path.splitext(film)[0]) # print(os.path.splitext(film)[0]) for line in films: # x = line.split(", ") title = line.lower() # release = x[1] query = "+".join(title.split()) URL = "https://www.imdb.com/search/title/?title=" + query print(URL) # print(release) try: response = s.get(URL) #getting contect from IMDB Website content = response.content # print(response.status_code) soup = BeautifulSoup(response.content, features="html.parser") #searching all films containers found containers = soup.find_all("div", class_="lister-item-content") for result in containers: name1 = result.h3.a.text name = result.h3.a.text.lower() # Uncomment below lines if you want year specific as well, define year variable before this # year = result.h3.find( # "span", class_="lister-item-year text-muted unbold" # ).text.lower() #if film found (searching using name) if title in name: #scraping rating rating = result.find("div",class_="inline-block ratings-imdb-rating")["data-value"] #scraping genre genre = result.p.find("span", class_="genre") genre = genre.contents[0] #appending name, rating and genre to individual lists names.append(name1) ratings.append(rating) genres.append(genre) except Exception: print("Try again with valid combination of tile and release year") #storing in pandas dataframe df = pd.DataFrame({'Film Name':names,'Rating':ratings,'Genre':genres}) #making csv using pandas df.to_csv('film_ratings.csv', index=False, encoding='utf-8') |
данный код позволяет веб-скрапить данные о фильмах с IMDb на основе списка фильмов, находящихся в указанной папке, и сохранять полученные данные в CSV-файле.
24. Веб-скрейпинг комментариев Youtube
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | from selenium import webdriver import csv import time items=[] driver=webdriver.Chrome(r"C:/Users/hp/Anaconda3/chromedriver.exe") driver.get('https://www.youtube.com/watch?v=iFPMz36std4') driver.execute_script('window.scrollTo(1, 500);') #now wait let load the comments time.sleep(5) driver.execute_script('window.scrollTo(1, 3000);') username_elems = driver.find_elements_by_xpath('//*[@id="author-text"]') comment_elems = driver.find_elements_by_xpath('//*[@id="content-text"]') for username, comment in zip(username_elems, comment_elems): item = {} item['Author'] = username.text item['Comment'] = comment.text items.append(item) filename = 'C:/Users/hp/Desktop/commentlist.csv' with open(filename, 'w', newline='', encoding='utf-8') as f: w = csv.DictWriter(f,['Author','Comment']) w.writeheader() for item in items: w.writerow(item) |
данный код позволяет использовать Selenium для автоматизации веб-браузера, прокручивать страницу YouTube для загрузки комментариев, собирать данные об авторах комментариев и самих комментариях, а затем сохранять эти данные в CSV-файле.
25. Код для преобразования текста в речь с использованием gTTS
1 2 3 4 5 6 7 | from gtts import gTTS import os file = open("abc.txt", "r").read() speech = gTTS(text=file, lang='en', slow=False) speech.save("voice.mp3") os.system("voice.mp3") |
Данный код использует библиотеку gTTS (Google Text-to-Speech) для преобразования текста, содержащегося в файле “abc.txt”, в речь и сохранения её в аудиофайле “voice.mp3”.
Источником послужила данная статья: https://dev.to/harendra21/a-collection-of-25-awesome-python-scripts-mini-projects-3745#9-organized-download-folder-with-different-categories
