スクリプト・ファイル自動化

ファイルのコピー前後でSHA-256を比較し、内容を確認する

名前やサイズだけで判断せず、ファイルのバイト列のハッシュを比較してコピー結果を確認します。

目次を表示

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

対象読者コピーした文書が元のファイルと同じ内容か確認したいPython初心者

準備するもの
  • Python 3.12以上を用意してください。追加パッケージは不要です。
  • ZIPを新しいフォルダーに展開し、example.py、original.txt、copy.txtを同じ場所に置いてください。
  • まずは同梱の架空データを使ったテキストファイルで練習してください。読み取り中はファイルを変更しないでください。

01ファイル名ではなくバイト列を比較する

ファイル名とサイズが同じでも、内容が異なることがあります。SHA-256はファイルのバイト列を読み取り、64桁の16進数文字列を計算します。同じバイト列からは同じハッシュが得られるため、コピー前後の確認に使用できます。

この実習では、二つのファイルのハッシュが同じかどうかをレポートに記録します。ファイルの削除や置き換えは行いません。ハッシュが一致したという結果だけでは、作成者、公式に配布されたものかどうか、マルウェアが含まれていないかは判断できません。

02同梱ファイルを確認する

original.txtとcopy.txtには、同じ架空の文が一行入っています。example.pyは自身の場所を基準に二つのファイルを探して読み取ります。ターミナルの現在のフォルダーが異なっても、入力パスは変わりません。

text
Worknote synthetic file comparison sample.

画面上で同じテキストに見えても、改行形式、文字エンコーディング、末尾のスペースが異なると、バイト列とハッシュが変わることがあります。テキストを整形したりスペースを削除したりせず、そのまま比較します。

03最初の比較を実行する

bash
python example.py

新しいoutputsフォルダーとcomparison.jsonが作成されます。コンソールのsame_sha256=trueは、同梱の二つのファイルのハッシュが一致したことを意味します。outputsがすでにある場合は、上書きせずに停止します。再実行するときは、別のフォルダーに例を新しく展開してください。

04レポートで確認する値

キー意味
algorithm使用したハッシュアルゴリズムSHA-256
files比較した二つのファイルの名前
sha256各ファイルの64桁のハッシュ文字列
same_sha256二つのハッシュが同じならtrue、異なればfalse

ファイル名とハッシュの順序は対応しています。同梱の例ではtrueを期待します。レポートファイルが作成されたことと、比較結果がtrueであることは別なので、値を直接確認してください。

05コードの要点とサンプル全体

digest関数はファイルをバイナリ読み取りモードで開き、1 MiBずつ読み取ってハッシュの状態を更新します。ファイル全体を一度にメモリへ読み込むことはありません。二つの入力をすべて読み終えてから結果フォルダーを作成します。

example.py
"""Compare two local synthetic files without changing them."""
import hashlib
import json
from pathlib import Path

BASE = Path(__file__).resolve().parent

def digest(path):
    value = hashlib.sha256()
    with path.open('rb') as stream:
        for chunk in iter(lambda: stream.read(1024 * 1024), b''):
            value.update(chunk)
    return value.hexdigest()

def main():
    output = BASE / 'outputs'
    if output.exists():
        raise ValueError('outputs already exists; choose a fresh extraction folder.')
    left, right = BASE / 'original.txt', BASE / 'copy.txt'
    hashes = [digest(left), digest(right)]
    result = {'algorithm': 'SHA-256', 'files': [left.name, right.name],
              'sha256': hashes, 'same_sha256': hashes[0] == hashes[1]}
    output.mkdir(exist_ok=False)
    with (output / 'comparison.json').open('x', encoding='utf-8') as stream:
        json.dump(result, stream, indent=2)
        stream.write('\n')
    print('same_sha256=' + str(result['same_sha256']).lower())
    print('Created outputs/comparison.json')

if __name__ == '__main__':
    try:
        main()
    except (OSError, ValueError) as error:
        raise SystemExit(f'Stopped: {error}') from error

06異なる内容も判別できるか確認する

  1. ZIPを新しいフォルダーにもう一度展開し、最初の結果と分けてください。
  2. copy.txt内のsampleをSampleに変更して保存してください。
  3. python example.pyを実行してください。
  4. same_sha256=falseであることを確認し、二つのハッシュを比較してください。

文字数が同じままでも、一バイトが変わればハッシュ比較で違いを確認できます。このコードでは、不一致の原因が破損か意図的な編集かまでは判断できません。

07停止したときに確認すること

ファイルが存在しないか読み取れない場合は、Stoppedメッセージとともに終了します。ZIPの一部しか展開していない状態ではないか、ファイル名が正しいかを確認してください。既存のoutputsが原因のエラーなら、別のフォルダーに新しく展開して実行してください。

ディスクへの書き込みエラーが発生すると、新しいoutputsに不完全なレポートが残ることがあります。完了メッセージとJSONの内容を確認するまでは、結果を使用しないでください。

08ハッシュ比較の限界

暗号学的ハッシュにも理論上は衝突の可能性があるため、数学的に完全な同一性の証明とは呼びません。この例は、通常のコピー確認に使う小さなツールです。公式ダウンロードの真正性を確認するには、信頼できる配布元が提供するハッシュや署名と比較する別の手順が必要です。

読み取り中にファイルが変わる状況、ネットワークドライブの障害、アクセス権限、大容量ファイルでの性能は、別途確認が必要です。入力ファイルのスナップショットやロックは作成しません。

実行・検証の記録

2026-09-19 · Windows 11 · CPython 3.12.14 · 標準ライブラリ

  • 同一ファイルではtrue、同じ長さで内容が異なる場合はfalseになることを確認
  • 入力の欠落と既存の出力フォルダーの拒否を確認
  • 実行前後で入力のSHA-256が一致することを確認
検証範囲の限界
  • 同時変更、ディスクエラー、ネットワークドライブは検証していません。
  • ハッシュの一致は作成者やファイルの安全性を保証するものではありません。

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

自分で実行するためのサンプルファイル

コード、入力データ、実行手順が含まれています。展開して、まずREADME.txtを読んでください。

サンプルZIPをダウンロード

サンプルコード、ファイル名、入力キーは原文のままです。翻訳本文のコマンドと確認手順も併せて参照してください。

独自に作成した練習用資料 · 元のファイルを別に保管してから実行してください。

参考資料

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