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のタスクスケジューラを使えば、毎日決まった時刻に自動実行できます。
- 「タスクスケジューラ」を起動
- 「基本タスクの作成」を選択
- トリガー(実行タイミング)を設定
- 操作で「プログラムの開始」を選択
- Pythonの実行ファイルパスとスクリプトパスを指定
3. Cronで自動実行(Mac/Linux)
Unix系OSではCronを使用します。
# crontabを編集
crontab -e
# 毎日午前9時に実行
0 9 * * * /usr/bin/python3 /path/to/script.py


コメント