しごと自動化レシピ

WORK RECIPE Python

Pythonで存在しない日付と形式違いを検出する

入力された予定日がYYYY-MM-DD形式で実在するかを検査します。月末やうるう日の誤入力を、数値置換で勝手に直さず、確認が必要な行として表示する小さなレシピです。

掲載コード実行確認

確認日時:2026-10-17T07:36:11.573547+00:00

確認環境:{"os": "Windows", "os_release": "11", "python": "3.14.2", "launch_flags": ["-I", "-X", "utf8"]}

確認した範囲

  • 記事の入力例と期待結果を照合
  • 元入力のバイト列が不変

未確認・対象外

  • 実業務データ
  • 他OS・他Python版

実機での処理結果の確認と、記事の全画面操作の確認は別です。実行確認の記録(JSON)で確認結果と原稿のSHA-256を参照できます。

できあがるもの

1・4行目がOK、2・3行目がCHECKになる想定。締切超過や休日判定は行わない。確認環境と範囲は本記事の実行確認欄を参照してください。

始める前に

  • Python 3.11以降の実行環境。標準ライブラリだけを使い、追加パッケージや外部APIは不要。python --versionで起動を確認する。
  • 新しいローカル検証フォルダに架空の入力だけを置く。本番の共有フォルダや同期フォルダで実行しない。
入力例

dates.txtをUTF-8で作り、2026-10-01、2026-02-29、2026/10/02、2024-02-29をそれぞれ別行に置く。

手順

  1. 新しい検証フォルダへdates.txtを置く。1行が1日付で、空行も不正とする仕様にする。タイムゾーンを持つ日時や和暦は今回の対象外として別に扱う。
  2. 同じ検証フォルダへrecipe.pyをUTF-8で保存し、次のコードをコピーする。入力名が合うか確認し、出力ファイルが必要な手順では未作成の名前を使う。 ```python from datetime import date from pathlib import Path import re lines = Path('dates.txt').read_text(encoding='utf-8-sig').splitlines() for number, value in enumerate(lines, 1): valid = False if re.fullmatch(r'[0-9]{4}-[0-9]{2}-[0-9]{2}', value): try: parsed = date.fromisoformat(value) valid = parsed.isoformat() == value except ValueError: pass print(number, 'OK' if valid else 'CHECK', repr(value)) ```
  3. ターミナルをその検証フォルダで開き、python recipe.pyを実行する。入力は読み取り専用で扱う。エラー時は元データを編集せず、表示されたファイル名や入力形式を確認して停止する。
  4. 出力を元の行番号と見比べ、2行目の非うるう年の2月29日と3行目のスラッシュ形式がCHECKかを確認する。2024年のうるう日はOKの想定。新しい日付へ自動補正する処理は追加しない。

期待結果と照合する

1・4行目がOK、2・3行目がCHECKになる想定。締切超過や休日判定は行わない。確認環境と範囲は本記事の実行確認欄を参照してください。

まずこの入力例で確認し、件数や値が一致しているかを見ます。完了表示だけで判断せず、重複・空欄・対象外データも残っていないか確認してください。

うまくいかないとき

  • 実在する日付でも業務上の期限として正しいとは限らない。範囲や休日の確認は別に設計する。
  • 前後スペースを勝手に落とさない仕様なので、それを許容するなら明示的にルール変更する。

止める・元に戻す

処理を終了する。入力への書き込みも新規ファイルもないため、そのまま原文を再確認できる。

公式資料・対応範囲

参照日:2026-10-17。公式資料の一般的な機能説明と、本記事固有の入力例の実行検証は別です。実務での短縮時間や効果は未計測です。

同じツールで試す

Pythonの記事一覧へ →