Сборник рабочих скриптов на Python с подробными инструкциями
Готовые скрипты Python: от простого к сложному
Как написать универсальный скрипт для обработки CSV-файлов, чтобы он принимал аргументы командной строки и корректно обрабатывал ошибки?
Основой для многих задач является скрипт, который читает данные из CSV, фильтрует их по условию и сохраняет результат в новый файл. Ниже представлено наиболее эффективное решение, использующее модуль csv и библиотеку argparse.
import csv
import argparse
def process_csv(input_file, output_file, column, min_value):
try:
with open(input_file, 'r', encoding='utf-8') as infile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames
with open(output_file, 'w', encoding='utf-8', newline='') as outfile:
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
if row[column] and float(row[column]) >= min_value:
writer.writerow(row)
print(f"Результат сохранен в {output_file}")
except Exception as e:
print(f"Ошибка: {e}")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Фильтр CSV по числовому столбцу')
parser.add_argument('input', help='Путь к входному CSV')
parser.add_argument('output', help='Путь к выходному CSV')
parser.add_argument('column', help='Имя столбца для фильтрации')
parser.add_argument('min_value', type=float, help='Минимальное значение')
args = parser.parse_args()
process_csv(args.input, args.output, args.column, args.min_value)
как запустить скрипт python в windows (выполнение скриптов python)
Инструкция: сохраните скрипт как filter_csv.py и запустите командой:
python filter_csv.py data.csv result.csv age 18Python готовый скрипт (примеры скриптов python)
Скрипт прочитает файл data.csv, оставит только строки, где столбец age больше или равен 18, и запишет результат в result.csv.
Типичные ошибки:
- Ошибка кодировки: если CSV в другой кодировке (например, cp1251), укажите
encoding='cp1251'. - Файл не найден: проверьте путь и текущую директорию.
- Некорректные данные в столбце: используйте
try-exceptвнутри цикла для пропуска ошибочных строк.
Вариант 1. Как скачать все файлы с FTP-сервера в локальную папку одним скриптом?
Для автоматического получения данных с FTP удобно использовать модуль ftplib. Цель: рекурсивно скачать все файлы из удалённой директории.
import ftplib
import os
def download_ftp(host, username, password, remote_dir, local_dir):
ftp = ftplib.FTP(host)
ftp.login(username, password)
ftp.cwd(remote_dir)
if not os.path.exists(local_dir):
os.makedirs(local_dir)
filenames = ftp.nlst()
for filename in filenames:
local_path = os.path.join(local_dir, filename)
with open(local_path, 'wb') as f:
ftp.retrbinary(f'RETR {filename}', f.write)
print(f'Скачан: {filename}')
ftp.quit()
download_ftp('ftp.example.com', 'user', 'pass', '/pub', './local_folder')
Python папка скрипта (работа со скриптами python)
Сценарий использования: загрузка ежедневных отчётов с сервера. Проблемы: если сервер требует пассивный режим, добавьте ftp.set_pasv(True); если имя файла содержит нелатинские символы, потребуется кодировка.
Возможные ошибки: тайм-аут соединения - увеличьте таймаут через ftplib.FTP(timeout=30). Отсутствие прав доступа - проверьте логин/пароль.
Вариант 2. Как проверить орфографию в текстовом файле с помощью Python?
Используется библиотека pyspellchecker или enchant. Пример с pyspellchecker (установка: pip install pyspellchecker).
from spellchecker import SpellChecker
def check_spelling(file_path):
spell = SpellChecker(language='ru')
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read()
words = text.split()
misspelled = spell.unknown(words)
print('Ошибки найдены в словах:', misspelled)
for word in misspelled:
suggestion = spell.correction(word)
if suggestion:
print(f"{word} -> {suggestion}")
check_spelling('text.txt')
Python 3 скрипты (создание скриптов на python)
Цель: быстрое выявление опечаток в документации или статьях. Проблемы: для русского языка нужна отдельная установка словаря (pip install pyspellchecker[ru]). Ложные срабатывания на технических терминах - добавьте их в исключения.
Вариант 3. Как отслеживать изменения в папке и автоматически архивировать новые файлы?
Модуль watchdog позволяет наблюдать за файловой системой. Пример: при добавлении нового файла в папку он упаковывается в ZIP.
import zipfile
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class ArchiveHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory:
file_path = event.src_path
zip_name = file_path + '.zip'
with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zf:
zf.write(file_path, os.path.basename(file_path))
print(f'Архивирован: {file_path}')
if __name__ == '__main__':
path = '.'
event_handler = ArchiveHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
while True:
import time
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
Использование: автоматическое резервное копирование новых документов. Проблемы: рекурсивный мониторинг (параметр recursive=True) может замедлить систему при большом количестве папок; на Windows требуется административные права для наблюдения за сетевыми папками.
Расширенные примеры с нестандартными решениями
Как парсить веб-страницы с динамическим контентом и сохранять результат в структурированном JSON?
Ниже используется selenium для загрузки страницы и BeautifulSoup для извлечения данных. Скрипт собирает заголовки новостей со страницы, которая подгружается через JavaScript.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import json
import time
def scrape_dynamic_news(url):
options = webdriver.ChromeOptions()
options.add_argument('--headless') # фоновый режим
driver = webdriver.Chrome(options=options)
driver.get(url)
try:
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'news-title'))
)
except:
print('Элементы не загрузились')
driver.quit()
return
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
titles = soup.find_all('h2', class_='news-title')
data = [t.get_text(strip=True) for t in titles]
driver.quit()
with open('news.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f'Сохранено {len(data)} заголовков')
scrape_dynamic_news('https://example.com/news')
Результат (пример содержимого news.json):
[ "Первая новость", "Вторая новость", "Третья новость" ]
Как реализовать многопоточное скачивание изображений из списка URL с отображением прогресса?
Используются модули concurrent.futures и requests. Пример загружает 50 изображений параллельно, что значительно ускоряет процесс.
import requests
import concurrent.futures
import os
def download_image(url, folder):
try:
response = requests.get(url, timeout=10)
if response.status_code == 200:
filename = os.path.join(folder, url.split('/')[-1])
with open(filename, 'wb') as f:
f.write(response.content)
return f"Успешно: {filename}"
else:
return f"Ошибка HTTP: {url}"
except Exception as e:
return f"Исключение: {url} - {e}"
urls = [f'https://example.com/image{i}.jpg' for i in range(1, 51)]
folder = 'downloaded'
os.makedirs(folder, exist_ok=True)
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
future_to_url = {executor.submit(download_image, url, folder): url for url in urls}
for future in concurrent.futures.as_completed(future_to_url):
result = future.result()
print(result)
Результат вывода (выборочно):
Успешно: downloaded/image1.jpg Ошибка HTTP: https://example.com/image30.jpg Успешно: downloaded/image2.jpg ...
Как создать телеграм-бота для получения погоды через API и отправки сообщения по расписанию?
Используются библиотеки python-telegram-bot и requests. Бот каждое утро отправляет текущую температуру в заданный чат.
import asyncio
from telegram import Bot
from telegram.ext import Application, CommandHandler, ContextTypes
import requests
import schedule
TOKEN = 'ваш_токен'
CHAT_ID = 'ваш_chat_id'
OPENWEATHER_API_KEY = 'ключ_погодного_api'
def get_weather(city='Moscow'):
url = f'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={OPENWEATHER_API_KEY}&units=metric'
response = requests.get(url)
if response.status_code == 200:
data = response.json()
temp = data['main']['temp']
description = data['weather'][0]['description']
return f'Сейчас в {city}: {temp}°C, {description}'
return 'Не удалось получить погоду'
async def send_weather(bot):
text = get_weather()
await bot.send_message(chat_id=CHAT_ID, text=text)
async def start(update, context):
await update.message.reply_text('Привет! Я буду присылать погоду каждое утро.')
async def main():
application = Application.builder().token(TOKEN).build()
application.add_handler(CommandHandler('start', start))
# Пример с schedule (запускается отдельно в цикле)
import time
while True:
schedule.run_pending()
time.sleep(60)
if __name__ == '__main__':
bot = Bot(token=TOKEN)
schedule.every().day.at('08:00').do(lambda: asyncio.run(send_weather(bot)))
asyncio.run(main())
Результат - бот ежедневно в 8:00 отправляет сообщение вида:
Сейчас в Moscow: 5.2°C, облачно с прояснениями
Как автоматически генерировать отчёт в формате HTML из данных БД SQLite с помощью Pandas?
С помощью pandas данные превращаются в красивую таблицу, а jinja2 формирует HTML.
import sqlite3
import pandas as pd
from jinja2 import Template
def generate_report(db_path, template_html):
conn = sqlite3.connect(db_path)
df = pd.read_sql_query("SELECT name, age, salary FROM employees WHERE salary > 50000", conn)
conn.close()
with open(template_html, 'r') as f:
template = Template(f.read())
html_out = template.render(table=df.to_html(classes='table table-striped', index=False))
with open('report.html', 'w', encoding='utf-8') as f:
f.write(html_out)
print('Отчёт сгенерирован: report.html')
generate_report('employees.db', 'template.html')
Пример шаблона template.html:
<html><head><link rel="stylesheet" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.min.css"></head><body>
<h2>Сотрудники с зарплатой выше 50 000</h2>
{{ table }}
</body></html>
Результат - файл report.html с полноценной таблицей, готовой к просмотру в браузере.