Categories: Python

Коллекция из 25 потрясающих скриптов Python

В этой статье собрана коллекция из 25 потрясающих скриптов Python:

1. Конвертировать JSON в CSV

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. Генератор паролей

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. Поиск строки в файлах

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. Получить все ссылки с заданной веб-страницы

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. Водяной знак на изображении

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. Собрать и загрузить все изображения с веб-страницы

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. Уведомление о низком заряде батареи

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. Рассчитайте свой возраст

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. Папка организована для загрузки с различными категориями

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-файла

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-адрес и имя хоста веб-сайта

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. Изменение размера изображения

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

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. Скриншот веб-сайта

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. Разделить файлы на части

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. Зашифровать и расшифровывать тексты

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. Скриншот экрана через регулярные промежутки времени

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. Конвертер десятичной системы в двоичную

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-приложение

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. Конвертер валют

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&#231;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&#237;viano,Bolivia Bol&#237;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&#039;Italia,B&#252;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&#227;o Tom&#233; and Pr&#237;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&#039;anga,Tonga Pa&#039;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&#237;var,Venezuela Bol&#237;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&#233; Financi&#232;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&#233; Financi&#232;re Africaine (BCEAO) Franc,Benin,Burkina Faso,Ivory Coast,Guinea-Bissau,Mali,Niger,Senegal,Togo",
    "XPF : CFP Franc,Comptoirs Fran&#231;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. Создание простого секундомера

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-архива

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

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

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

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

Recent Posts

  • Excel

Как правильно открыть CSV с многострочными ячейками в Excel

Если при открытие csv файла с помощью excel У все поехали ячейки - это простой… Read More

% дней назад
  • Python

Загрузка проекта на Github и Автодеплой на сервер

Простые шаги как происходит Загрузка проекта на Github и Автодеплой на сервер Сделайте работу проще! Read More

% дней назад
  • Python
  • Полезная минутка

Миграция базы данных в проектах Python

Миграция базы данных - помогают с этим библиотеки SQLAlchemy и Alembic. Read More

% дней назад
  • Python

Команды Git – Шпаргалка по основным командам Git

Основные Команды Git, которые точно пригодятся. Сохрани себе шпаргалку Git Read More

% дней назад
  • Python

Установка PostgreSQL на сервер Ubuntu и подключение через pgAdmin

Установка PostgreSQL на сервер Read More

% дней назад
  • Полезная минутка

Как создать PrimaryKey для таблицы в PostgreSQL

Как создать PrimaryKey в талице базы данных SQL [РЕШЕНО] Ошибка relation tablename_id_seq doesn't exist Read More

% дней назад