Python自動化スクリプト例10選【初心者向け】

スポンサーリンク
プログラミング・開発
スポンサーリンク

Python自動化スクリプトで日常業務が劇的に変わる

毎日繰り返し行う単純作業に時間を取られていませんか?ファイルの整理、データの集計、定型メールの送信など、これらの作業はPythonで自動化できます。

Pythonは初心者にも扱いやすく、わずか数行のコードで複雑な処理を自動化できるプログラミング言語です。本記事では、実務で即活用できる10個の実用的な自動化スクリプト例を紹介します。

プログラミング経験がない方でも、コードをコピー&ペーストして使えるよう、丁寧に解説していきます。

なぜPythonが自動化に最適なのか

Pythonの3つの強み

Pythonが自動化スクリプトに選ばれる理由は明確です。

  • シンプルな文法: 他の言語と比べて圧倒的に読みやすく、書きやすい
  • 豊富なライブラリ: ファイル操作、Web操作、データ処理など様々な用途に対応
  • クロスプラットフォーム: Windows、Mac、Linuxどの環境でも動作

実際、2023年のStack Overflow調査によると、Pythonは最も人気のあるプログラミング言語の一つであり、特に自動化・スクリプティング分野で高い支持を得ています。

自動化で得られる具体的なメリット

自動化によって以下のような効果が期待できます。

  • 毎日1時間かかる作業が5分に短縮
  • ヒューマンエラーの削減(正確性99%以上)
  • 夜間や休日も無人で処理を実行可能
  • 創造的な業務に時間を使える

【基礎編】すぐに使えるPython自動化スクリプト5選

1. ファイル自動整理スクリプト

デスクトップやダウンロードフォルダがファイルで溢れていませんか?このスクリプトは拡張子ごとにファイルを自動で分類します。

import os
import shutil
from pathlib import Path

def organize_files(folder_path):
    """指定フォルダ内のファイルを拡張子別に整理"""
    
    # 拡張子とフォルダ名の対応
    file_types = {
        'Images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
        'Documents': ['.pdf', '.docx', '.txt', '.xlsx'],
        'Videos': ['.mp4', '.avi', '.mov', '.mkv'],
        'Music': ['.mp3', '.wav', '.flac'],
        'Archives': ['.zip', '.rar', '.7z']
    }
    
    folder = Path(folder_path)
    
    for file in folder.iterdir():
        if file.is_file():
            file_ext = file.suffix.lower()
            
            # 該当する分類を探す
            for folder_name, extensions in file_types.items():
                if file_ext in extensions:
                    # フォルダがなければ作成
                    dest_folder = folder / folder_name
                    dest_folder.mkdir(exist_ok=True)
                    
                    # ファイル移動
                    shutil.move(str(file), str(dest_folder / file.name))
                    print(f"移動: {file.name} → {folder_name}/")
                    break

# 実行例
organize_files("C:/Users/YourName/Downloads")

使い方: folder_pathを整理したいフォルダのパスに変更して実行するだけです。毎週金曜日にタスクスケジューラで自動実行すれば、常にフォルダがきれいな状態を保てます。

2. 複数Excelファイル一括結合スクリプト

月次報告などで、複数の部署から提出されたExcelファイルを一つにまとめる作業は時間がかかります。このスクリプトで数秒で完了します。

import pandas as pd
import glob
from pathlib import Path

def merge_excel_files(folder_path, output_file):
    """フォルダ内の全Excelファイルを結合"""
    
    all_files = glob.glob(f"{folder_path}/*.xlsx")
    
    if not all_files:
        print("Excelファイルが見つかりません")
        return
    
    # 全ファイルを読み込んでリストに格納
    df_list = []
    for file in all_files:
        df = pd.read_excel(file)
        # ファイル名をカラムとして追加
        df['ソースファイル'] = Path(file).name
        df_list.append(df)
        print(f"読込: {Path(file).name}")
    
    # 全データフレームを結合
    merged_df = pd.concat(df_list, ignore_index=True)
    
    # 結果を出力
    merged_df.to_excel(output_file, index=False)
    print(f"\n結合完了! → {output_file}")
    print(f"総行数: {len(merged_df)}")

# 実行例
merge_excel_files("./月次報告", "./統合レポート.xlsx")

必要なライブラリ: pip install pandas openpyxl

このスクリプトは、各ファイルの出所も記録するため、後からデータの確認が必要になった際も安心です。

3. Webサイト更新チェッカー

競合サイトや重要な情報源の更新を自動でチェックし、変更があればメール通知します。

import requests
import hashlib
import time
from datetime import datetime

def check_website_change(url, check_interval=3600):
    """Webサイトの更新を監視"""
    
    previous_hash = None
    
    while True:
        try:
            # Webサイトの内容を取得
            response = requests.get(url, timeout=10)
            content = response.text
            
            # 内容をハッシュ化
            current_hash = hashlib.md5(content.encode()).hexdigest()
            
            if previous_hash is None:
                print(f"[{datetime.now()}] 監視開始: {url}")
            elif current_hash != previous_hash:
                print(f"\n[{datetime.now()}] ★更新検出!★")
                print(f"URL: {url}")
                # ここにメール送信処理を追加可能
                
            previous_hash = current_hash
            
            # 指定間隔待機(デフォルト1時間)
            time.sleep(check_interval)
            
        except Exception as e:
            print(f"エラー: {e}")
            time.sleep(60)

# 実行例
check_website_change("https://example.com/news", check_interval=1800)

必要なライブラリ: pip install requests

このスクリプトは、クラウドサーバーで常時稼働させることで、24時間365日の監視が可能になります。

4. 画像一括リサイズツール

SNS投稿用に大量の画像をリサイズする作業も自動化できます。

from PIL import Image
import os
from pathlib import Path

def resize_images(input_folder, output_folder, max_width=1920):
    """画像を指定幅にリサイズして保存"""
    
    # 出力フォルダを作成
    Path(output_folder).mkdir(exist_ok=True)
    
    image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.gif']
    processed_count = 0
    
    for file in Path(input_folder).iterdir():
        if file.suffix.lower() in image_extensions:
            try:
                img = Image.open(file)
                
                # アスペクト比を保ってリサイズ
                if img.width > max_width:
                    ratio = max_width / img.width
                    new_height = int(img.height * ratio)
                    img_resized = img.resize((max_width, new_height), Image.LANCZOS)
                else:
                    img_resized = img
                
                # 保存
                output_path = Path(output_folder) / file.name
                img_resized.save(output_path, quality=90, optimize=True)
                
                print(f"処理完了: {file.name} ({img.width}x{img.height} → {img_resized.width}x{img_resized.height})")
                processed_count += 1
                
            except Exception as e:
                print(f"エラー({file.name}): {e}")
    
    print(f"\n合計 {processed_count} 枚の画像を処理しました")

# 実行例
resize_images("./元画像", "./リサイズ済み", max_width=1200)

必要なライブラリ: pip install Pillow

1,000枚の画像でも数分で処理が完了します。画質を維持しながらファイルサイズも最適化されます。

5. CSVデータ自動集計レポート

毎日の売上データなどを自動で集計し、HTMLレポートを生成します。

import pandas as pd
from datetime import datetime

def create_sales_report(csv_file, output_html):
    """売上CSVから統計レポートを生成"""
    
    # データ読み込み
    df = pd.read_csv(csv_file)
    
    # 基本統計
    total_sales = df['売上'].sum()
    avg_sales = df['売上'].mean()
    max_sales = df['売上'].max()
    record_count = len(df)
    
    # カテゴリ別集計
    category_summary = df.groupby('カテゴリ')['売上'].agg(['sum', 'count', 'mean'])
    
    # HTMLレポート生成
    html_content = f"""
    
    
        
        売上レポート
        
    
    
        

売上レポート

生成日時: {datetime.now().strftime('%Y年%m月%d日 %H:%M')}

サマリー

  • 総売上: ¥{total_sales:,.0f}
  • 平均売上: ¥{avg_sales:,.0f}
  • 最高売上: ¥{max_sales:,.0f}
  • 取引件数: {record_count}件

カテゴリ別集計

{category_summary.to_html()} """ # HTMLファイル保存 with open(output_html, 'w', encoding='utf-8') as f: f.write(html_content) print(f"レポート生成完了: {output_html}") # 実行例 create_sales_report("./sales_data.csv", "./report.html")

このスクリプトは、視覚的に分かりやすいHTMLレポートを生成するため、経営陣への報告にもそのまま使えます。

【応用編】業務を大幅に効率化する自動化スクリプト5選

6. 自動メール送信システム

顧客リストに基づいて、個別にカスタマイズされたメールを一斉送信します。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import pandas as pd

def send_personalized_emails(csv_file, subject, template):
    """CSVリストから個別メールを送信"""
    
    # Gmail設定(事前にアプリパスワード取得が必要)
    smtp_server = "smtp.gmail.com"
    smtp_port = 587
    sender_email = "your_email@gmail.com"
    sender_password = "your_app_password"
    
    # 顧客リスト読み込み
    df = pd.read_csv(csv_file)
    
    # SMTPサーバー接続
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(sender_email, sender_password)
    
    success_count = 0
    
    for index, row in df.iterrows():
        try:
            # メッセージ作成
            msg = MIMEMultipart()
            msg['From'] = sender_email
            msg['To'] = row['メールアドレス']
            msg['Subject'] = subject
            
            # テンプレートに個別情報を埋め込み
            body = template.format(
                name=row['名前'],
                company=row.get('会社名', '')
            )
            
            msg.attach(MIMEText(body, 'plain', 'utf-8'))
            
            # 送信
            server.send_message(msg)
            print(f"送信完了: {row['名前']} ({row['メールアドレス']})")
            success_count += 1
            
        except Exception as e:
            print(f"送信失敗: {row['メールアドレス']} - {e}")
    
    server.quit()
    print(f"\n{success_count}/{len(df)} 件のメール送信完了")

# 実行例
template = """
{name} 様

いつもお世話になっております。

{company}様向けの新サービスのご案内です...

株式会社サンプル
"""

send_personalized_emails("customers.csv", "新サービスのご案内", template)

セキュリティ注意: Gmailを使用する場合は、2段階認証を有効にし、アプリパスワードを生成して使用してください。

7. PDF自動生成・結合ツール

複数の文書を自動でPDF化し、一つのファイルにまとめます。

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from PyPDF2 import PdfMerger
import os

def create_pdf_from_data(data_list, output_file):
    """データからPDFレポートを生成"""
    
    # 日本語フォント登録
    # 注: フォントファイルのパスは環境に応じて変更
    try:
        pdfmetrics.registerFont(TTFont('Japanese', 'C:/Windows/Fonts/msgothic.ttc'))
        font_name = 'Japanese'
    except:
        font_name = 'Helvetica'
    
    c = canvas.Canvas(output_file, pagesize=A4)
    width, height = A4
    
    y_position = height - 50
    
    c.setFont(font_name, 16)
    c.drawString(50, y_position, "自動生成レポート")
    y_position -= 40
    
    c.setFont(font_name, 12)
    
    for item in data_list:
        if y_position < 100:  # 改ページ
            c.showPage()
            y_position = height - 50
            c.setFont(font_name, 12)
        
        c.drawString(50, y_position, str(item))
        y_position -= 25
    
    c.save()
    print(f"PDF生成完了: {output_file}")

def merge_pdfs(pdf_list, output_file):
    """複数PDFを結合"""
    
    merger = PdfMerger()
    
    for pdf in pdf_list:
        if os.path.exists(pdf):
            merger.append(pdf)
            print(f"追加: {pdf}")
    
    merger.write(output_file)
    merger.close()
    print(f"\nPDF結合完了: {output_file}")

# 実行例
data = ["項目1: データA", "項目2: データB", "項目3: データC"]
create_pdf_from_data(data, "report1.pdf")

# 複数PDFを結合
merge_pdfs(["report1.pdf", "report2.pdf", "report3.pdf"], "統合版.pdf")

必要なライブラリ: pip install reportlab PyPDF2

8. Webスクレイピングで価格比較

ECサイトから商品価格を定期的に取得し、最安値を通知します。

import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

def scrape_prices(urls_dict):
    """複数サイトから価格情報を取得"""
    
    results = []
    
    for site_name, url in urls_dict.items():
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            }
            response = requests.get(url, headers=headers, timeout=10)
            soup = BeautifulSoup(response.content, 'html.parser')
            
            # サイトごとに価格取得ロジックを調整
            # 以下は例(実際のサイト構造に合わせて変更必要)
            price_element = soup.find('span', class_='price')
            
            if price_element:
                price_text = price_element.text.strip()
                # 数値のみ抽出
                price = int(''.join(filter(str.isdigit, price_text)))
                
                results.append({
                    'サイト': site_name,
                    '価格': price,
                    'URL': url,
                    '取得日時': datetime.now()
                })
                
                print(f"{site_name}: ¥{price:,}")
            
        except Exception as e:
            print(f"{site_name} 取得失敗: {e}")
    
    # 結果をDataFrameに
    df = pd.DataFrame(results)
    
    if not df.empty:
        # 最安値を表示
        min_price_row = df.loc[df['価格'].idxmin()]
        print(f"\n★最安値: {min_price_row['サイト']} - ¥{min_price_row['価格']:,}")
        
        # CSV保存
        df.to_csv('price_history.csv', mode='a', header=False, index=False)
    
    return df

# 実行例
urls = {
    'サイトA': 'https://example.com/product1',
    'サイトB': 'https://example.com/product2'
}

scrape_prices(urls)

注意: Webスクレイピングは各サイトの利用規約を確認し、サーバーに負荷をかけないよう適切な間隔で実行してください。

9. バックアップ自動化スクリプト

重要なファイルを定期的に自動バックアップします。

import shutil
import os
from datetime import datetime
from pathlib import Path
import zipfile

def backup_files(source_folder, backup_folder, compress=True):
    """指定フォルダをバックアップ"""
    
    # バックアップフォルダ作成
    Path(backup_folder).mkdir(parents=True, exist_ok=True)
    
    # タイムスタンプ付きバックアップ名
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    backup_name = f"backup_{timestamp}"
    
    if compress:
        # ZIP圧縮バックアップ
        zip_path = os.path.join(backup_folder, f"{backup_name}.zip")
        
        with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
            for root, dirs, files in os.walk(source_folder):
                for file in files:
                    file_path = os.path.join(root, file)
                    arcname = os.path.relpath(file_path, source_folder)
                    zipf.write(file_path, arcname)
                    print(f"追加: {arcname}")
        
        # ファイルサイズ取得
        size_mb = os.path.getsize(zip_path) / (1024 * 1024)
        print(f"\nバックアップ完了: {zip_path}")
        print(f"サイズ: {size_mb:.2f} MB")
        
    else:
        # フォルダコピー
        backup_path = os.path.join(backup_folder, backup_name)
        shutil.copytree(source_folder, backup_path)
        print(f"バックアップ完了: {backup_path}")
    
    # 古いバックアップの削除(7日以上前)
    cleanup_old_backups(backup_folder, days=7)

def cleanup_old_backups(backup_folder, days=7):
    """古いバックアップを削除"""
    
    current_time = datetime.now()
    deleted_count = 0
    
    for item in Path(backup_folder).iterdir():
        item_age = current_time - datetime.fromtimestamp(item.stat().st_mtime)
        
        if item_age.days > days:
            if item.is_file():
                item.unlink()
            else:
                shutil.rmtree(item)
            print(f"削除(古いバックアップ): {item.name}")
            deleted_count += 1
    
    if deleted_count > 0:
        print(f"\n{deleted_count}個の古いバックアップを削除しました")

# 実行例
backup_files(
    source_folder="C:/重要データ",
    backup_folder="D:/Backups",
    compress=True
)

このスクリプトをWindowsタスクスケジューラで毎日深夜に実行すれば、完全自動のバックアップシステムが構築できます。

10. SNS自動投稿ツール(Twitter/X)

事前に準備したコンテンツを定期的に自動投稿します。

import tweepy
import pandas as pd
from datetime import datetime
import time

def auto_post_tweets(csv_file, api_keys):
    """CSVから予約投稿を実行"""
    
    # Twitter API認証
    client = tweepy.Client(
        consumer_key=api_keys['consumer_key'],
        consumer_secret=api_keys['consumer_secret'],
        access_token=api_keys['access_token'],
        access_token_secret=api_keys['access_token_secret']
    )
    
    # 投稿内容読み込み
    df = pd.read_csv(csv_file)
    df['投稿日時'] = pd.to_datetime(df['投稿日時'])
    
    posted_count = 0
    
    for index, row in df.iterrows():
        scheduled_time = row['投稿日時']
        current_time = datetime.now()
        
        # 投稿時刻チェック
        if current_time >= scheduled_time and pd.isna(row.get('投稿済み')):
            try:
                # ツイート投稿
                response = client.create_tweet(text=row['本文'])
                
                print(f"投稿完了: {row['本文'][:30]}...")
                
                # 投稿済みフラグ
                df.at[index, '投稿済み'] = True
                df.at[index, '実投稿日時'] = current_time
                posted_count += 1
                
                # API制限対策で待機
                time.sleep(5)
                
            except Exception as e:
                print(f"投稿失敗: {e}")
    
    # CSV更新
    df.to_csv(csv_file, index=False)
    print(f"\n{posted_count}件の投稿を実行しました")

# 実行例(APIキーは環境変数から取得推奨)
api_keys = {
    'consumer_key': 'YOUR_CONSUMER_KEY',
    'consumer_secret': 'YOUR_CONSUMER_SECRET',
    'access_token': 'YOUR_ACCESS_TOKEN',
    'access_token_secret': 'YOUR_ACCESS_TOKEN_SECRET'
}

auto_post_tweets('tweet_schedule.csv', api_keys)

必要なライブラリ: pip install tweepy

CSVフォーマット例:

投稿日時,本文,投稿済み
2024-01-15 09:00:00,おはようございます!今日も頑張りましょう,
2024-01-15 12:00:00,ランチタイムですね,

自動化スクリプトを実行する3つの方法

1. 手動実行(初心者向け)

最もシンプルな方法は、必要な時にPythonファイルを直接実行することです。

python script_name.py

2. タスクスケジューラで自動実行(Windows)

Windowsのタスクスケジューラを使えば、毎日決まった時刻に自動実行できます。

  1. 「タスクスケジューラ」を起動
  2. 「基本タスクの作成」を選択
  3. トリガー(実行タイミング)を設定
  4. 操作で「プログラムの開始」を選択
  5. Pythonの実行ファイルパスとスクリプトパスを指定

3. Cronで自動実行(Mac/Linux)

Unix系OSではCronを使用します。

# crontabを編集
crontab -e

# 毎日午前9時に実行
0 9 * * * /usr/bin/python3 /path/to/script.py

自動化スクリプト作成時の注意点とベストプ

コメント

タイトルとURLをコピーしました