テキストファイルの内容から原稿用紙枚数を計算するスクリプト

ZIKUUの文書管理システムにあるサンプルプログラムの一つです。役に立ちそうなもので、公開可能なものは公にしていこうと思っています。

このスクリプトは、テキストファイルを読んで、原稿用紙換算したときの枚数を計算するものです。よかったら使ってください。

スクリプト

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import math
import argparse

def load_text(path: str) -> str:
    if path == "-" or path is None:
        data = sys.stdin.read()
        return data
    with open(path, "r", encoding="utf-8") as f:
        return f.read()

def count_chars(text: str, exclude_spaces: bool) -> int:
    # 改行はカウントしない(原稿用紙のマス目に入らないため)
    # デフォルトでは空白(半角/全角)・句読点・記号・数字・英字も1字として数える
    if exclude_spaces:
        # 半角スペース・全角スペース・タブを除外
        filtered = text.replace("\n", "").replace("\r", "")
        filtered = filtered.replace(" ", "").replace("\u3000", "").replace("\t", "")
        return len(filtered)
    else:
        filtered = text.replace("\n", "").replace("\r", "")
        return len(filtered)

def main():
    parser = argparse.ArgumentParser(
        description="原稿用紙換算ツール(400字=1枚既定)。改行は数えず、文字は1字=1カウント。"
    )
    parser.add_argument("path", help="テキストファイルのパス。標準入力を使う場合は '-' を指定。")
    parser.add_argument("--chars-per-page", type=int, default=400, help="1枚あたりの文字数(既定: 400)")
    parser.add_argument("--exclude-spaces", action="store_true",
                        help="空白(半角/全角)とタブを文字数から除外する")
    args = parser.parse_args()

    text = load_text(args.path)
    lines = text.splitlines()
    total_lines = len(lines)

    total_chars = count_chars(text, exclude_spaces=args.exclude_spaces)
    pages = math.ceil(total_chars / max(1, args.chars_per_page))  # 0除算保護

    # 結果表示
    print("=== 原稿用紙換算 結果 ===")
    print(f"ファイル       : {args.path}")
    print(f"行数(空白行含む) : {total_lines}")
    print(f"総文字数        : {total_chars} 文字"
          + ("(空白除外)" if args.exclude_spaces else "(空白含む)"))
    print(f"換算設定        : 1枚あたり {args.chars_per_page} 文字")
    print(f"原稿用紙換算    : 約 {pages} 枚")

if __name__ == "__main__":
    main()

スクリプトの使い方

# コマンド構文
gensaku_count.py [-h] [--chars-per-page CHARS_PER_PAGE]
                        [--exclude-spaces]
                        path
# 簡単版(デフォルトは400字詰め原稿用紙)
python gensaku_count.py ファイル名

# 一枚の文字数を指定する
python gensaku_count.py --chars-per-page 文字数 ファイル名

# その他、ヘルプ参照。
python gensaku_count.py -h

実行結果の例

$ python gensaku_count.py axis_and_culture_book.md
=== 原稿用紙換算 結果 ===
ファイル       : axis_and_culture_book.md
行数(空白行含む) : 1250
総文字数        : 25824 文字(空白含む)
換算設定        : 1枚あたり 400 文字
原稿用紙換算    : 約 65 枚

ZIKUUでは「AIの社会実装研究」として、LLMを活用したアプリケーションの構成や設計の検討・検証を行い、実際にLLMを使ってさまざまな生成物をつくっています。また、塾の運営やコミュニティ運営への応用についても日々研究しています。
ZIKUUという場所は、一言でいえば実験施設のようなものです。ここで得られた成果は、地域や社会に還元していくことを目指しています。

私が提唱しているのが「週末科学者」と「二刀流」という考え方です。

「週末科学者」とは、日常の仕事とは別に、自分が気になったこと・興味を持ったことを楽しみながら学び、成果として形にしていく人のことです。
研究テーマはなんでも構いません。私自身はその実践として、LLMの論文を書き、実証実験を行い、思想や哲学の書をまとめ、小説を書く――そんな活動をしています。
もともと文章を書くのは得意ではありませんが、AIに助けてもらいながら進めています。いまは特に、SF小説の執筆に熱中しています。上で紹介したスクリプトも、その過程の中で生まれたものです。

もう一つの「二刀流」とは、複数の分野にまたがって専門性を磨く、あるいはその姿勢を持ち続けることです。
分野を越えて学ぶ過程では、視野が広がり、自然や社会、そして自分自身への問いを立てる訓練になります。

現在、ZIKUUのスタッフたちは、それぞれがこれまで取り組んでこなかった分野の学習に挑んでいます。
得意ではない分野にも踏み込み、自分でテーマを決め、計画を立てて進めています。私はときどき助言はしますが、基本的に口出しはしません。
ZIKUUは失敗を許容する場です。挑戦のハードルを下げ、誰もが試せる環境を整えています。だからこそ、たとえ失敗することがわかっていても、私は手を出さず、各人がどのように受け止め、どう乗り越えていくかを静かに見守っています。

「テキストファイルの内容から原稿用紙枚数を計算するスクリプト」への1件のフィードバック

コメントする