납품용 압축 파일을 보냈는데 안에 든 문서 한 장에 오타가 있습니다. 파일이 수백 개라 전부 풀고 고치고 다시 묶으려니 시간도 걸리고 임시 폴더도 지저분해집니다.
ZIP은 파일마다 따로 압축해 담고 맨 뒤에 목차를 붙이는 구조라, 한 개만 바꾸는 길이 따로 있습니다. 텍스트 400개가 든 압축 파일에서 한 개만 새 내용으로 바꿔 보며 세 가지 방법을 재 봤습니다.

가장 빠른 방법에 함정이 있습니다
세 방법 모두 목표한 파일의 내용은 새 것으로 바뀌었습니다. 확인해 보니 셋 다 26,400바이트짜리 새 내용을 정확히 돌려주었습니다. 갈린 것은 그다음입니다.
| 방법 | 걸린 시간 | 항목 수 | 같은 이름 중복 |
|---|---|---|---|
| 전부 풀고 다시 묶기 | 2.39 초 | 400 | 없음 |
| 메모리에서 다시 묶기 | 1.51 초 | 400 | 없음 |
| 뒤에 덧붙이기 | 0.01 초 | 401 | 1 건 |
덧붙이기는 240배 가까이 빠릅니다. 뒤에 새 내용을 이어 붙이고 목차만 갱신하면 되기 때문입니다. 그런데 지운 것이 아니라 더한 것이라 같은 이름이 두 번 들어갑니다.
항목이 401개가 됐고, 압축 파일 크기도 5,054,908바이트로 원본보다 오히려 커졌습니다. 옛 내용이 그대로 남아 있는 것입니다.
이 상태가 위험한 이유는 어느 쪽을 꺼낼지 프로그램마다 다르기 때문입니다. 목차를 먼저 보는 도구는 나중 것을, 앞에서부터 훑는 도구는 옛것을 꺼냅니다. 내 화면에서는 고쳐진 문서가 보이는데 받는 쪽에서는 옛 문서가 열릴 수 있습니다.
고친 문서에 지워야 할 내용이 있었다면 문제가 더 큽니다. 파일 안에 옛 내용이 통째로 남아 있으니 지운 것이 아닙니다.
안전하면서 빠른 쪽
메모리에서 다시 묶는 방법이 균형이 좋습니다. 임시 폴더에 400개를 쏟아 놓았다가 다시 읽는 왕복이 없어서, 전부 푸는 것보다 1.6배 빨랐습니다. 결과는 항목 400개에 중복 없음으로 깨끗합니다.
import zipfile
TARGET = "docs/report_137.txt"
NEW = "고친 내용입니다.\n".encode("utf-8")
with zipfile.ZipFile("archive.zip") as zin, \
zipfile.ZipFile("archive_new.zip", "w", zipfile.ZIP_DEFLATED) as zout:
for info in zin.infolist():
data = NEW if info.filename == TARGET else zin.read(info.filename)
zout.writestr(info.filename, data)
# 확인
with zipfile.ZipFile("archive_new.zip") as z:
names = z.namelist()
print(len(names), "항목, 중복", len(names) - len(set(names)), "건")
마지막 두 줄이 중요합니다. 바꾼 뒤에는 항목 수와 중복을 반드시 확인하시는 편이 좋습니다. 위 측정에서 덧붙이기의 문제가 드러난 것도 이 확인 덕분입니다.
주의할 점이 하나 있습니다. 이 방식은 원본을 고치지 않고 새 파일을 만듭니다. 같은 이름으로 덮어쓰려 하면 읽는 중에 쓰게 되어 파일이 상합니다. 새로 만든 뒤 이름을 바꾸는 순서로 하시면 됩니다.
안에 뭐가 들었는지부터
고칠 파일의 정확한 이름을 알아야 위 코드가 동작합니다. 폴더 경로까지 포함한 이름이 필요합니다. 압축을 풀지 않고 목록만 보는 방법은 파일명이 깨져 보일 때의 처리와 함께 알아 두면 편합니다. 이름이 깨진 상태라면 바꿔 넣을 때도 그 이름을 그대로 써야 합니다.
바꾼 뒤 파일이 이상해졌다면 어디가 깨졌는지 확인하는 방법으로 짚어 볼 수 있고, 크기 때문에 보내기 어렵다면 조각으로 나눠 보내는 방법 쪽이 이어집니다.
압축 파일 안의 문서를 고쳤다면 보내기 전에 항목 수를 세어 보세요. 원본보다 하나 늘어 있다면 옛 내용이 아직 그 안에 있습니다.
위 시간과 크기는 윈도우 11에서 파이썬 3.14.6의 표준 라이브러리 zipfile로 측정했습니다. 시간은 파일 개수와 디스크 상태에 따라 달라지므로 순서만 참고하시면 됩니다.
'압축' 카테고리의 다른 글
| 압축 파일 안에 뭐가 들었는지, 풀지 않고 확인하고 필요한 것만 꺼내기 (0) | 2026.09.30 |
|---|---|
| 최고 압축을 고르면 얼마나 더 줄어들까, 레벨 0부터 9까지 재 봤습니다 (0) | 2026.09.27 |
| 사진과 동영상을 ZIP으로 묶으면 용량이 줄 거라는 생각, 실제로는 거의 그대로입니다 (0) | 2026.09.22 |
| 작은 파일이 수천 개인 폴더는 압축해도 왜 별로 안 줄어들까 (0) | 2026.09.17 |
| ZIP이 손상되었다고 뜰 때, 어디가 깨졌는지부터 확인하면 살릴 수 있습니다 (0) | 2026.08.30 |