チーム業務・コラボレーション

チームのファイル命名規則を設定し、Python でファイル名を確認する

シンプルなチーム向けファイル名規則を定義し、合成フォルダでテストして、何も名前変更や削除せずに確認レポートを作成します。チェッカーは構造エラー、無効な日付、未対応の拡張子を分けて扱います。

目次を表示

この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English

対象読者ファイルを共有またはアーカイブする前に、予測可能なファイル名と簡単な自動チェックを導入したいチーム向けのガイドです。

準備するもの
  • Python 3.12 と、そのバージョンを起動できるターミナルコマンド。
  • スクリプトが outputs の下にフォルダを作成できる作業フォルダ。
  • チームで使用する project codes, document labels, version format, allowed extensions についての合意。
  • 必要なのは Python 標準ライブラリのみです: csv, datetime, pathlib, re.

01チェッカーを書く前に命名規則を書く

この例では YYYYMMDD_project_document_vNN.ext 形式を使用します。date は8桁で、実在する暦日でなければなりません。project と document には小文字の英字または数字を使用し、必要に応じて hyphen で区切ります。version は v の後に正確に2桁の数字を続けます。allowed extensions は pdf, docx, xlsx, csv, txt です。

text
YYYYMMDD_project_document_vNN.ext

Example:
20260920_alpha_test-plan_v01.pdf
  • ファイルに関連する作業日を YYYYMMDD で使用します。
  • project と document の tokens は小文字を使用します。
  • underscores はファイル名の4つの主要部分の間だけで使用します。
  • versions には final, latest, new, revised ではなく v01, v02 などを使用します。
  • 元の file extension を保持し、合意した list に制限します。

02有効名と無効名を含む合成フォルダを作成する

以下の filenames は合成データであり、この記事のために作成したものです。セットアップスクリプトを create_file_naming_demo.py として保存してください。空の files を8個作成し、4個は規則に従い、4個は意図的に違反します。

python
from pathlib import Path

SOURCE = Path("outputs") / "file_naming_demo"
FILENAMES = [
    "20260920_alpha_test-plan_v01.pdf",
    "20260920_alpha_results_v02.csv",
    "20260921_beta_meeting-notes_v03.txt",
    "20261001_beta_budget_v01.xlsx",
    "2026-09-20_alpha_notes_v01.txt",
    "20260920_Alpha_notes_v01.txt",
    "20260920_alpha_notes_final.txt",
    "20260230_beta_results_v01.csv",
]

SOURCE.parent.mkdir(parents=True, exist_ok=True)
SOURCE.mkdir()  # Stop if the synthetic source already exists.

for filename in FILENAMES:
    target = SOURCE / filename
    with target.open("xb"):
        pass

最初の4つの names は PASS になる想定です。5つ目は YYYYMMDD ではなく hyphenated date を使用しています。6つ目には uppercase project token が含まれます。7つ目は vNN の代わりに final を使用しています。8つ目は形自体は正しいですが、存在しない日付 2026-02-30 を含んでいます。

038つの名前を手作業で分類する

Filename想定 status理由
20260920_alpha_test-plan_v01.pdfPASS構造に一致し、date も有効
20260920_alpha_results_v02.csvPASS構造に一致し、date も有効
20260921_beta_meeting-notes_v03.txtPASS構造に一致し、date も有効
20261001_beta_budget_v01.xlsxPASS構造に一致し、date も有効
2026-09-20_alpha_notes_v01.txtFAILSTRUCTURE_ERROR
20260920_Alpha_notes_v01.txtFAILSTRUCTURE_ERROR
20260920_alpha_notes_final.txtFAILSTRUCTURE_ERROR
20260230_beta_results_v01.csvFAILINVALID_DATE

したがって想定合計は、checked files 8件、passes 4件、failures 4件です。3件は structural failures で、1件は filename の構造は有効ですが calendar date が無効です。

04名前変更せずにファイル名を確認する

次のスクリプトを check_file_names.py として保存してください。filenames だけを読み取り、別の output folder に CSV report を書き込みます。source file の rename, move, edit, delete は行いません。

python
import csv
import re
from datetime import datetime
from pathlib import Path

SOURCE = Path("outputs") / "file_naming_demo"
OUTPUT_DIR = Path("outputs") / "file_naming_result"
REPORT = OUTPUT_DIR / "file_naming_report.csv"
ALLOWED_EXTENSIONS = {"pdf", "docx", "xlsx", "csv", "txt"}

NAME_PATTERN = re.compile(
    r"^(?P<date>[0-9]{8})_"
    r"(?P<project>[a-z0-9]+(?:-[a-z0-9]+)*)_"
    r"(?P<document>[a-z0-9]+(?:-[a-z0-9]+)*)_"
    r"(?P<version>v[0-9]{2})\."
    r"(?P<extension>[a-z0-9]+)$"
)


def check_filename(filename: str) -> tuple[str, str]:
    match = NAME_PATTERN.fullmatch(filename)
    if match is None:
        return "FAIL", "STRUCTURE_ERROR"

    extension = match.group("extension")
    if extension not in ALLOWED_EXTENSIONS:
        return "FAIL", "UNSUPPORTED_EXTENSION"

    try:
        datetime.strptime(match.group("date"), "%Y%m%d")
    except ValueError:
        return "FAIL", "INVALID_DATE"

    return "PASS", ""


def main() -> None:
    if not SOURCE.is_dir():
        raise FileNotFoundError(f"Source folder not found: {SOURCE}")
    if OUTPUT_DIR.exists():
        raise FileExistsError(f"Output folder already exists: {OUTPUT_DIR}")

    files = sorted(path for path in SOURCE.iterdir() if path.is_file())
    results = []

    for path in files:
        status, issue = check_filename(path.name)
        results.append({
            "filename": path.name,
            "status": status,
            "issue": issue,
        })

    OUTPUT_DIR.parent.mkdir(parents=True, exist_ok=True)
    OUTPUT_DIR.mkdir()
    with REPORT.open("x", encoding="utf-8", newline="") as stream:
        writer = csv.DictWriter(
            stream,
            fieldnames=["filename", "status", "issue"],
        )
        writer.writeheader()
        writer.writerows(results)

    passed = sum(row["status"] == "PASS" for row in results)
    failed = len(results) - passed
    print(f"Files checked: {len(results)}.")
    print(f"Passed: {passed}; failed: {failed}.")
    print(f"Report: {REPORT.as_posix()}")


if __name__ == "__main__":
    main()
text
python check_file_names.py

05想定レポートと比較する

report には source file ごとに1行が含まれるはずです。filenames は確認前にアルファベット順に sort されるため、output order は setup-script list ではなく sorted names に従います。

想定件数
Files checked8
PASS4
FAIL4
STRUCTURE_ERROR3
INVALID_DATE1

以下の想定 console output は、合成 filenames と checker から手作業で導出したものです。実際に取得した execution log ではありません。

text
Files checked: 8.
Passed: 4; failed: 4.
Report: outputs/file_naming_result/file_naming_report.csv

06ファイル名を変更する前に failures を確認する

  • 意図した4つの valid names がすべて PASS になることを確認します。
  • 20260230_beta_results_v01.csv は text shape が regex と一致していても拒否されることを確認します。
  • 何かを修正する前に、shared files の rename を誰に許可するか決めます。
  • 既存 filenames に依存する links, scripts, CAD references, document references, shared-drive shortcuts を確認します。
  • OUTPUT_DIR を変更せずに checker を再実行します。以前の report を置き換えるのではなく FileExistsError で停止するはずです。
問題確認すること
STRUCTURE_ERROR が多い書面化した team rule が、実際に使われている naming practice と一致しているか確認します。
Uppercase または spaces が頻繁に現れる個別に files を修正するのではなく、一貫して禁止するか rule を見直すか決めます。
有効に見える date が失敗するYYYYMMDD text が実在する calendar date を表しているか確認します。
users が final や latest を使い続ける明示的な version numbers を使用し、file が approved または released になる条件は別に定義します。
Renaming で references が壊れるdependent systems と links を評価するまで rename を自動化しないでください。

07命名規則を複雑にしすぎず実用的に保つ

filename convention は proper version control, document management, metadata の代わりにはなりません。v03 という file name だけでは、content が v02 より新しいこと、正しい person に承認されたこと、正しい project に関連付けられていることは証明できません。

この例では、1つの folder 直下の files だけを確認します。subfolders の recursive scan、複数 shared drives 間の uniqueness 強制、file contents の確認、project token が実在する project と対応しているかの検証は行いません。

team が convention を変更する場合は effective date を記録し、old files をそのまま認めるのか rename するのか決めます。実用的な rule は、覚えられる程度に安定し、自動チェックが有用な結果を出せる程度に厳格である必要があります。

実行・検証の記録

2026-09-20 · 手作業で確認した例 · 対象: Python 3.12 · 標準ライブラリ: csv, datetime, pathlib, re · 未実行

  • 8個の合成 filenames を 4 valid, 4 invalid と手作業で分類しました。
  • 3つの structural failures を特定しました: hyphenated date, uppercase project token, final version label。
  • 20260230 は8桁の date shape に一致していても、2026-02-30 が無効な日付であることを calendar reasoning で確認しました。
  • 想定 totals を 4 PASS, 4 FAIL, 3 STRUCTURE_ERROR, 1 INVALID_DATE と手作業で導出しました。
  • full filename matching, allowed-extension checking, calendar-date validation, output collision protection, rename または delete operations がないことをスクリプトで確認しました。
  • 想定される console output を手作業で導出しました。
検証範囲の限界
  • この回答の作成者はコードを実行しておらず、files または reports は作成していません。
  • recursive folders, shared-drive links, case-insensitive filesystem behavior, cross-project uniqueness, dependent application references はテストしていません。
  • 命名規則は team policy の例であり、実際の workflow に合わせて変更してください。
  • 公式ドキュメントの URL は既知のドキュメント所在地に基づいて記載していますが、ライブでは確認していません。

サイト全体の執筆・検証方針

参考資料

説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。