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

コピー前後の SHA-256 ハッシュを比較してファイル内容を確認する

ファイル名やサイズだけに頼らず、ファイルの bytes の hash を比較してコピー結果を確認します。

目次を表示

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

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

準備するもの
  • Python 3.12 以降を用意します。追加パッケージは不要です。
  • ZIP を新しいフォルダに展開し、example.py, original.txt, copy.txt を同じ場所に置きます。
  • まず付属の合成 text files で練習します。読み取り中は files を変更しないでください。

01ファイル名ではなく bytes を比較する

files は、names と sizes が同じでも contents が異なる場合があります。SHA-256 は file bytes を読み取り、64文字の hexadecimal (base 16) string を計算します。同じ bytes からは同じ hash が得られるため、コピー前後の files を確認するために使用できます。

この演習では、2つの files の hash が同じかどうかを report に記録します。files を削除したり置き換えたりはしません。hash が一致しても、その file を誰が作成したか、official distribution かどうか、malware が含まれていないかまでは証明できません。

02付属ファイルを確認する

original.txt と copy.txt には同じ1行の合成文が含まれています。example.py は自身の場所を基準に両方の files を探して読み取ります。terminal の current folder が異なっていても input paths は変わりません。

text
Worknote synthetic file comparison sample.

画面上で text が同じに見えても、line endings, character encoding, trailing spaces の違いによって bytes と hashes が異なることがあります。files は text を整えたり spaces を削除したりせず、そのまま比較します。

03最初の比較を実行する

bash
python example.py

新しい outputs folder と comparison.json file が作成されます。console value の same_sha256=true は、付属の2 files の hashes が一致したことを意味します。outputs がすでに存在する場合、program は上書きせず停止します。例をもう一度実行するには、別の folder に新しい copy を展開してください。

04report で確認する値

Key意味
algorithm使用した hash algorithm: SHA-256
files比較した2つの file names
sha256各 file の64文字の hash string
same_sha2562つの hashes が一致すれば true、一致しなければ false

file names と hashes は同じ順序で表示されます。付属例の想定結果は true です。report file が作成されたことと、comparison result が true であることは別なので、値そのものを確認してください。

05コードの仕組みと完全な例

digest function は file を binary read mode で開き、1 MiB ずつ読みながら hash state を更新します。file 全体を一度に memory に読み込むことはありません。results folder は、両方の input files を最後まで読み取った後にだけ作成されます。

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. 最初の result と分けるため、ZIP をもう一度新しい folder に展開します。
  2. copy.txt で sample を Sample に変更して file を保存します。
  3. python example.py を実行します。
  4. same_sha256=false になることを確認し、2つの hashes を比較します。

character count が同じままでも、1 byte の変更によって hash comparison で違いを検出できます。このコードは mismatch の原因が corruption なのか intentional editing なのかまでは判断しません。

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

file が見つからない、または読み取れない場合、program は Stopped message を表示して終了します。archive 全体を展開したことと、file names が正しいことを確認してください。existing outputs folder が原因の場合は、別の folder に新しく展開してそこで実行します。

disk write error が発生した場合、新しい outputs folder に不完全な report が残ることがあります。completion message と JSON contents の両方を確認するまでは results を使用しないでください。

08hash comparison の制限

cryptographic hashes にも理論上 collision の可能性があるため、これは数学的に完全な identity proof とは説明しません。この例は日常的な copy check 用の小さな tool です。official download の authenticity を検証するには、trusted distributor が提供した hash または signature と比較する別の手順が必要です。

読み取り中に files が変更される場合、network drive failures, access permissions, large files での performance には別の確認が必要です。コードは input files の snapshots を作成したり lock したりしません。

実行・検証の記録

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

  • 同一 files では true、同じ長さでも内容が異なる files では false になることを確認しました
  • missing input と existing output folder が拒否されることを確認しました
  • 実行前後で input SHA-256 hashes が一致することを確認しました
検証範囲の限界
  • concurrent modification, disk errors, network drives は検証していません。
  • hashes の一致は author identity や file safety を保証しません。

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

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

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

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

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

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

参考資料

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