adbird(広告鳥) 備忘録

横書き原稿を縦書き原稿にする際の年号表記変換スクリプト

横書き原稿を、縦書き原稿にする際に、 「1940(昭和15)年」を「一九四〇(昭和十五)年」 などと変換するためのPythonスクリプト

いつものようにChatGPTに作ってもらった。

きっとまだ不完全だと思うが、とりあえずこれで対応。

import shutil
import re

# 数値を日本語の漢数字に変換(年号用:1〜99まで対応)
def number_to_kanji(n):
    if n == 0:
        return '〇'
    kanji_digits = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九']
    if n < 10:
        return kanji_digits[n]
    elif n < 100:
        tens = n // 10
        ones = n % 10
        kanji = ''
        if tens == 1:
            kanji += '十'
        else:
            kanji += kanji_digits[tens] + '十'
        if ones > 0:
            kanji += kanji_digits[ones]
        return kanji
    else:
        raise ValueError("年号は99年まで対応です")

# 西暦も一桁ずつ変換(例:1942 → 一九四二)
def digitwise_kanji(num):
    kanji_digits = '〇一二三四五六七八九'
    return ''.join(kanji_digits[int(d)] for d in str(num))

# 変換処理
def replace_year(text):
    # パターン: 例 1942(昭和17)年、1912(大正元)年
    pattern = re.compile(r'(\d{4})((明治|大正|昭和)(\d{1,2}|元))年')

    def replacer(match):
        western_year = int(match.group(1))
        era = match.group(2)
        era_year_raw = match.group(3)

        # 「元」→「一」
        if era_year_raw == '元':
            era_year_kanji = '一'
        else:
            era_year_kanji = number_to_kanji(int(era_year_raw))

        western_kanji = digitwise_kanji(western_year)
        return f'{western_kanji}({era}{era_year_kanji})年'

    return pattern.sub(replacer, text)

# ファイル処理
file_path = 'input.txt'
backup_path = 'input_backup.txt'

# バックアップ作成
shutil.copy(file_path, backup_path)

# 読み込み → 変換 → 上書き
with open(file_path, 'r', encoding='utf-8') as f:
    original_text = f.read()

converted_text = replace_year(original_text)

with open(file_path, 'w', encoding='utf-8') as f:
    f.write(converted_text)

print(f"変換完了: 元ファイルは {backup_path} にバックアップされました。")