Uncategorized

Pythonでテキストファイルを簡単編集!メールのテンプレート化も楽々

概要

日々の業務でテキストファイルの編集に時間を費やしていませんか?Pythonを使えば、特定のタグをリアルタイムで編集し、その内容を簡単にクリップボードにコピーできるプログラムを作成できます。本記事では、特にメールのテンプレート化や定型文書の編集に便利なプログラムを紹介します。

使用例

例えば、以下のような注文書のテンプレートがあるとします。

========================================
① 消耗品
----------------------------------------
② 品名: <品名>
----------------------------------------
③ 数量: <数量>
----------------------------------------
④ 単位: 1個
----------------------------------------
⑤ 単価(税抜き): <単価>円
(合計 <合計金額>円)
----------------------------------------
⑥ 納入希望日: 最短納期
----------------------------------------
⑦ 発注先: 株式会社企業商事
----------------------------------------
⑧ 依頼者: <依頼者>
----------------------------------------
⑨ メーカー名: 企業製作所
製品番号: <製品番号>
見積もりNo.: なし
納品場所: 第1工場
========================================

このプログラムを使うことで、<品名>, <数量>, <単価>, <合計金額>, <依頼者>, <製品番号>といったタグに対応する部分をGUI上で簡単に編集できます。そして、編集後の内容をボタン一つでクリップボードにコピーできます。メールのテンプレート化や定型文書の編集に最適です。

必要なプログラム

  • Python 3.7以上
  • tkinter ライブラリ(標準ライブラリの一部)
  • pyperclip ライブラリ
  • tkinterdnd2 ライブラリ

インストール方法

必要なライブラリをインストールするには、以下のコマンドを実行してください。

pip install tkinterdnd2 pyperclip

使用手順

  1. Pythonスクリプトの準備:
    • text_editor_app.pyとしてスクリプトを保存します(プログラムの記述は省略)。
  2. プログラムの実行:
    • コマンドラインから以下のコマンドを実行してPythonプログラムを起動します。bashコードをコピーするpython text_editor_app.py
  3. ドラッグアンドドロップでファイルを読み込む:
    • プログラムが起動したら、編集したいテキストファイルをウィンドウ内にドラッグアンドドロップします。
  4. タグの編集:
    • 読み込んだテキストファイル内の<>で囲まれたタグが自動的に検出され、対応するエントリーフィールドが表示されます。これらのフィールドに値を入力することで、テキスト内容がリアルタイムで更新されます。
  5. 編集内容のコピー:
    • 「コピー」ボタンをクリックすると、編集後のテキスト全体がクリップボードにコピーされます。

注意点

  • テキストファイル内のタグは<>で囲まれている必要があります。
  • ファイルをドラッグアンドドロップする際、対応するディレクトリへのアクセス権限が必要です。

プログラム

Pythonの標準ライブラリtkintertkinterdnd2を使用して、GUIの構築とドラッグアンドドロップ機能を実装しています。

import tkinter as tk
from tkinter import filedialog, messagebox
import pyperclip
import re
from tkinterdnd2 import DND_FILES, TkinterDnD

class TextEditorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("テキストファイルビューア")

        # Textbox to display the content of the file
        self.textbox = tk.Text(self.root, height=15, width=80)
        self.textbox.pack()

        # Frame to hold entry widgets
        self.entry_frame = tk.Frame(self.root)
        self.entry_frame.pack()

        # Button to copy content to clipboard
        self.copy_button = tk.Button(self.root, text="コピー", command=self.copy_to_clipboard)
        self.copy_button.pack()

        # Dictionary to hold entry widgets and their corresponding tags
        self.entries = {}

        # Enable drag-and-drop for the root window
        self.root.drop_target_register(DND_FILES)
        self.root.dnd_bind('<<Drop>>', self.drop)

    def drop(self, event):
        file_path = event.data
        if file_path:
            file_path = file_path.strip('{}')  # Remove curly braces from the path
            self.load_file(file_path)

    def load_file(self, file_path):
        if file_path:
            with open(file_path, 'r', encoding='utf-8') as file:
                self.content = file.read()
                self.textbox.delete(1.0, tk.END)
                self.textbox.insert(tk.END, self.content)
            self.create_entries()

    def create_entries(self):
        # Clear any previous entries
        for widget in self.entry_frame.winfo_children():
            widget.destroy()

        # Find all <tag> elements
        tags = re.findall(r'<(.*?)>', self.content)
        self.entries = {}

        for tag in tags:
            frame = tk.Frame(self.entry_frame)
            label = tk.Label(frame, text=f"{tag}:")
            entry = tk.Entry(frame)
            entry.bind("<KeyRelease>", self.update_content)
            label.pack(side="left")
            entry.pack(side="left")
            frame.pack()
            self.entries[tag] = entry

    def update_text(self):
        content = self.content
        for tag, entry in self.entries.items():
            value = entry.get()
            content = re.sub(f"<{tag}>", value, content)
        self.textbox.delete(1.0, tk.END)
        self.textbox.insert(tk.END, content)

    def copy_to_clipboard(self):
        content = self.textbox.get(1.0, tk.END)
        pyperclip.copy(content)
        messagebox.showinfo("情報", "クリップボードにコピーされました")

    def update_content(self, event):
        self.update_text()

if __name__ == "__main__":
    root = TkinterDnD.Tk()
    app = TextEditorApp(root)
    root.mainloop()

なお、下記txtファイルをダウンロードして「.py」に書き換えて使用することもできます。

まとめ

本記事では、テキストファイルをドラッグアンドドロップで読み込み、タグをリアルタイムで編集し、その内容をクリップボードにコピーするPythonプログラムを紹介しました。このプログラムを使用することで、メールのテンプレート化や定型文書の編集作業を大幅に効率化できます。ぜひ試してみてください。

-Uncategorized