본문 바로가기
압축

압축 파일 안에 뭐가 들었는지, 풀지 않고 확인하고 필요한 것만 꺼내기

by 무나주 2026. 9. 30.

메일로 받은 ZIP이 수백 메가바이트인데 필요한 건 그 안의 문서 한 장입니다. 확인하려고 전부 풀면 디스크가 차고, 다 풀고 나서 원하던 파일이 아니면 지우는 일이 또 남습니다.

ZIP은 맨 뒤에 목차를 따로 들고 있는 형식이라 풀지 않고도 안을 볼 수 있습니다. 얼마나 적게 읽고도 되는지, 텍스트 300개가 든 압축 파일로 하는 일마다 디스크에서 실제로 읽은 양을 세어 봤습니다.

ZIP 부분 추출 실측 표. 텍스트 300개를 담은 5,765,439바이트 ZIP에서 목록만 보기는 19,542바이트를 읽어 0.3퍼센트에 5.1밀리초, 한 개만 꺼내기는 38,709바이트로 0.7퍼센트에 3.9밀리초, 전부 풀기는 5,765,459바이트 전체를 읽어 628.6밀리초가 걸렸다. 목록만으로 300개의 이름과 원본 총량 30,000,000바이트를 알 수 있다. 측정 환경은 윈도우 11, 파이썬 3.14.6, 표준 라이브러리 zipfile

 

목록을 보는 데 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로 측정했고, 읽은 양은 파일 객체를 감싸 실제 읽기 호출량을 세어 얻었습니다. 시간은 디스크 상태에 따라 달라집니다.