메일로 받은 ZIP이 수백 메가바이트인데 필요한 건 그 안의 문서 한 장입니다. 확인하려고 전부 풀면 디스크가 차고, 다 풀고 나서 원하던 파일이 아니면 지우는 일이 또 남습니다.
ZIP은 맨 뒤에 목차를 따로 들고 있는 형식이라 풀지 않고도 안을 볼 수 있습니다. 얼마나 적게 읽고도 되는지, 텍스트 300개가 든 압축 파일로 하는 일마다 디스크에서 실제로 읽은 양을 세어 봤습니다.

목록을 보는 데 0.3퍼센트면 충분했습니다
5,765,439바이트짜리 ZIP에서 파일 목록과 각 파일의 원본 크기를 읽어 봤습니다. 디스크에서 실제로 읽은 양은 19,542바이트였습니다.
| 하는 일 | 실제로 읽은 바이트 | 압축 파일 대비 | 걸린 시간 |
|---|---|---|---|
| 목록만 보기 | 19,542 B | 0.3 % | 5.1 ms |
| 한 개만 꺼내기 | 38,709 B | 0.7 % | 3.9 ms |
| 전부 풀기 | 5,765,459 B | 100 % | 628.6 ms |
이 19,542바이트만으로 300개의 파일 이름, 각각의 원본 크기, 압축된 크기, 날짜를 전부 알 수 있었습니다. 안에 든 알맹이 총량이 30,000,000바이트라는 것도 압축을 한 번도 풀지 않고 확인했습니다.
가능한 이유는 ZIP의 구조에 있습니다. 압축된 내용이 앞쪽에 줄줄이 놓이고, 맨 뒤에 전체 목차가 따로 붙습니다. 프로그램은 파일 끝으로 바로 가서 목차만 읽으면 됩니다. 앞쪽은 손도 대지 않습니다.
한 개만 꺼낼 때도 건너뜁니다
목차에는 파일마다 압축 파일 안 어느 위치에 있는지가 적혀 있습니다. 그래서 특정 파일을 꺼낼 때 앞의 146개를 지나칠 필요가 없습니다. 그 자리로 바로 건너뛰어 필요한 만큼만 읽습니다.
측정에서 100,000바이트짜리 문서 하나를 꺼내는 데 읽은 양은 38,709바이트였습니다. 압축 파일 전체의 0.7퍼센트입니다. 전부 푸는 것과 비교하면 시간이 161배 차이였습니다.
실제 상황에서는 차이가 더 벌어집니다. 전부 풀면 30,000,000바이트를 디스크에 새로 써야 하지만, 하나만 꺼내면 그 파일 한 개만 생깁니다.
명령 한 줄로 목록 보기
윈도우에서는 압축 파일을 더블클릭하면 탐색기가 목록을 보여 줍니다. 이때도 전체를 푸는 것이 아니라 목차만 읽습니다. 그 안에서 원하는 파일 하나만 끌어내면 그것만 풀립니다.
여러 개를 다뤄야 하거나 원격 서버에서 확인해야 한다면 아래처럼 씁니다.
import zipfile
with zipfile.ZipFile("archive.zip") as z:
for info in z.infolist():
print(f"{info.filename:40s} {info.file_size:>10,} B"
f" -> {info.compress_size:>10,} B"
f" {info.date_time[0]}-{info.date_time[1]:02d}-{info.date_time[2]:02d}")
# 이름으로 찾아 한 개만 꺼내기
with zipfile.ZipFile("archive.zip") as z:
data = z.read("docs/report_147.txt") # 메모리로 바로
z.extract("docs/report_147.txt", "밖에") # 또는 폴더에 저장
이름을 정확히 몰라도 됩니다. [n for n in z.namelist() if n.endswith(".xlsx")]처럼 걸러 내면 원하는 확장자만 골라 볼 수 있습니다.
명령 프롬프트를 쓴다면 윈도우에 기본으로 들어 있는 tar로도 목록을 볼 수 있습니다.
tar -tvf archive.zip
목록만 보면 알 수 있는 것들
풀기 전에 목차만 확인해도 판단이 서는 경우가 많습니다. 압축을 풀면 디스크가 얼마나 필요한지는 원본 크기 합으로 미리 알 수 있고, 파일 이름이 이상하게 깨져 보인다면 만든 쪽의 인코딩 문제라 ZIP 한글 파일명이 깨질 때의 방법이 필요합니다.
목차에는 파일마다 검사값도 들어 있습니다. 이 값을 대조하면 어디가 깨졌는지 풀기 전에 짚어 낼 수 있고, 통째로 못 쓰게 됐는지 일부만 상했는지도 갈립니다. 반대로 압축 파일이 너무 커서 보내기 어려운 상황이라면 조각으로 나눠 보내는 방법 쪽이 답이 됩니다.
큰 압축 파일을 받으면 풀기 전에 목록부터 열어 보세요. 필요한 파일이 없다면 푸는 시간과 디스크를 통째로 아낄 수 있습니다.
위 바이트와 시간은 윈도우 11에서 파이썬 3.14.6의 표준 라이브러리 zipfile로 측정했고, 읽은 양은 파일 객체를 감싸 실제 읽기 호출량을 세어 얻었습니다. 시간은 디스크 상태에 따라 달라집니다.
'압축' 카테고리의 다른 글
| 압축 파일 안의 문서 한 장만 고쳐야 할 때, 전부 풀지 않고 바꾸기 (0) | 2026.10.01 |
|---|---|
| 최고 압축을 고르면 얼마나 더 줄어들까, 레벨 0부터 9까지 재 봤습니다 (0) | 2026.09.27 |
| 사진과 동영상을 ZIP으로 묶으면 용량이 줄 거라는 생각, 실제로는 거의 그대로입니다 (0) | 2026.09.22 |
| 작은 파일이 수천 개인 폴더는 압축해도 왜 별로 안 줄어들까 (0) | 2026.09.17 |
| ZIP이 손상되었다고 뜰 때, 어디가 깨졌는지부터 확인하면 살릴 수 있습니다 (0) | 2026.08.30 |