폴더 속 파일 목록을 CSV로 정리하기
하위 폴더까지 읽어 파일 경로·확장자·크기·수정 시각을 표로 남깁니다. 작은 예제 4개로 시작하고 원본과 기존 결과를 보존합니다.
이름이나 크기만으로 판단하지 않고 파일 바이트의 해시를 비교해 복사 결과를 점검합니다.
이런 분께복사한 문서가 원본과 같은 내용인지 확인하고 싶은 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 메시지와 함께 종료합니다. 압축을 일부만 풀지 않았는지, 파일명이 맞는지 확인하세요. 기존 outputs 오류라면 다른 폴더에 새로 풀어 실행하세요.
디스크 쓰기 오류가 나면 새 outputs에 불완전한 보고서가 남을 수 있습니다. 완료 메시지와 JSON 내용을 확인하기 전에는 결과를 사용하지 마세요.
암호학적 해시에도 이론적으로 충돌 가능성이 있으므로 수학적으로 완벽한 동일성 증명이라고 부르지 않습니다. 이 예제는 일반적인 복사 점검을 위한 작은 도구입니다. 공식 다운로드의 진위를 확인하려면 신뢰할 수 있는 배포처가 제공한 해시나 서명과 비교하는 별도 절차가 필요합니다.
읽는 동안 파일이 바뀌는 상황, 네트워크 드라이브 장애, 접근 권한과 대용량 파일의 성능은 별도 점검 대상입니다. 입력 파일에 대한 스냅샷이나 잠금을 만들지는 않습니다.
2026-09-19 · Windows 11 · CPython 3.12.14 · 표준 라이브러리
코드·입력 데이터·실행 안내가 포함되어 있습니다. 압축을 풀고 README.txt부터 읽어 주세요.
예제 ZIP 다운로드직접 작성한 연습 자료 · 원본을 따로 보관한 뒤 실행하세요.
설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.