フォルダー内のファイル一覧をCSVにまとめる
サブフォルダーまで調べ、ファイルのパス、拡張子、サイズ、更新時刻を表に記録します。小さなサンプルファイル4個から始め、元のファイルと既存の結果を保管します。
名前やサイズだけで判断せず、ファイルのバイト列のハッシュを比較してコピー結果を確認します。
この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 한국어
対象読者コピーした文書が元のファイルと同じ内容か確認したいPython初心者
ファイル名とサイズが同じでも、内容が異なることがあります。SHA-256はファイルのバイト列を読み取り、64桁の16進数文字列を計算します。同じバイト列からは同じハッシュが得られるため、コピー前後の確認に使用できます。
この実習では、二つのファイルのハッシュが同じかどうかをレポートに記録します。ファイルの削除や置き換えは行いません。ハッシュが一致したという結果だけでは、作成者、公式に配布されたものかどうか、マルウェアが含まれていないかは判断できません。
original.txtとcopy.txtには、同じ架空の文が一行入っています。example.pyは自身の場所を基準に二つのファイルを探して読み取ります。ターミナルの現在のフォルダーが異なっても、入力パスは変わりません。
Worknote synthetic file comparison sample.画面上で同じテキストに見えても、改行形式、文字エンコーディング、末尾のスペースが異なると、バイト列とハッシュが変わることがあります。テキストを整形したりスペースを削除したりせず、そのまま比較します。
python example.py新しいoutputsフォルダーとcomparison.jsonが作成されます。コンソールのsame_sha256=trueは、同梱の二つのファイルのハッシュが一致したことを意味します。outputsがすでにある場合は、上書きせずに停止します。再実行するときは、別のフォルダーに例を新しく展開してください。
| キー | 意味 |
|---|---|
| algorithm | 使用したハッシュアルゴリズムSHA-256 |
| files | 比較した二つのファイルの名前 |
| sha256 | 各ファイルの64桁のハッシュ文字列 |
| same_sha256 | 二つのハッシュが同じならtrue、異なればfalse |
ファイル名とハッシュの順序は対応しています。同梱の例ではtrueを期待します。レポートファイルが作成されたことと、比較結果がtrueであることは別なので、値を直接確認してください。
digest関数はファイルをバイナリ読み取りモードで開き、1 MiBずつ読み取ってハッシュの状態を更新します。ファイル全体を一度にメモリへ読み込むことはありません。二つの入力をすべて読み終えてから結果フォルダーを作成します。
"""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
文字数が同じままでも、一バイトが変わればハッシュ比較で違いを確認できます。このコードでは、不一致の原因が破損か意図的な編集かまでは判断できません。
ファイルが存在しないか読み取れない場合は、Stoppedメッセージとともに終了します。ZIPの一部しか展開していない状態ではないか、ファイル名が正しいかを確認してください。既存のoutputsが原因のエラーなら、別のフォルダーに新しく展開して実行してください。
ディスクへの書き込みエラーが発生すると、新しいoutputsに不完全なレポートが残ることがあります。完了メッセージとJSONの内容を確認するまでは、結果を使用しないでください。
暗号学的ハッシュにも理論上は衝突の可能性があるため、数学的に完全な同一性の証明とは呼びません。この例は、通常のコピー確認に使う小さなツールです。公式ダウンロードの真正性を確認するには、信頼できる配布元が提供するハッシュや署名と比較する別の手順が必要です。
読み取り中にファイルが変わる状況、ネットワークドライブの障害、アクセス権限、大容量ファイルでの性能は、別途確認が必要です。入力ファイルのスナップショットやロックは作成しません。
2026-09-19 · Windows 11 · CPython 3.12.14 · 標準ライブラリ
コード、入力データ、実行手順が含まれています。展開して、まずREADME.txtを読んでください。
サンプルZIPをダウンロードサンプルコード、ファイル名、入力キーは原文のままです。翻訳本文のコマンドと確認手順も併せて参照してください。
独自に作成した練習用資料 · 元のファイルを別に保管してから実行してください。
説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。