본문 바로가기

파일 형식 백과사전

행은 3천 개뿐인데 엑셀 파일이 3.4MB, 용량을 먹는 범인을 파일 안에서 찾아내기

엑셀 파일이 무거워지면 대개 데이터가 많아서라고 생각하게 됩니다. 하지만 실제로는 데이터 양과 파일 용량이 따로 노는 경우가 훨씬 흔합니다.

3,000행짜리 주문 내역을 실제로 만들어 저장해 보니 130.1KB였습니다. 그런데 같은 데이터에 무엇을 얹느냐에 따라 이 파일은 1MB가 되기도 하고 3.4MB가 되기도 했습니다. 데이터는 한 줄도 늘지 않았는데 말입니다.

 

 

먼저, 엑셀 파일은 사실 압축 폴더입니다

xlsx 파일은 하나의 덩어리가 아니라 여러 개의 파일을 ZIP으로 묶어 놓은 꾸러미입니다.

시트의 셀 내용, 서식 정의, 삽입된 사진이 각각 다른 파일로 들어 있습니다.

 

그래서 지금 당장, 프로그램을 하나도 설치하지 않고 내 파일의 범인을 확인할 수 있습니다. 문제의 파일을 복사한 뒤 복사본의 확장자를 .xlsx에서 .zip으로 바꾸고, 윈도우 탐색기에서 압축을 풀어 보세요.

 

안에 생긴 xl 폴더를 열면 media(삽입된 사진)와 worksheets(시트 내용) 폴더가 보입니다. 두 폴더를 오른쪽 버튼으로 눌러 [속성]에서 크기를 비교하면, 범인이 사진인지 셀인지 그 자리에서 갈립니다.

 

같은 3,000행 데이터를 담은 xlsx 실측 용량. 데이터만 130.1KB, 데이터 범위에만 서식 131.1KB, 빈 셀 47,000행까지 서식 확장 1,108.5KB(8.5배), 빈 행 삭제 후 재저장 131.1KB, 데이터에 사진 3장 삽입 3,456.2KB(26.6배) 가로 막대 그래프

 

케이스별로 실제 파일을 만들어 재 봤습니다

주문번호와 날짜, 고객명, 지역, 상품, 수량, 단가, 금액 8개 열에 3,000행을 채운 시트를 기준으로 삼고, 조건만 바꿔 가며 저장해 용량을 측정했습니다. 윈도우 11에서 파이썬 3.14.3과 openpyxl 3.1.5로 저장했습니다.

 

저장 조건 파일 용량 기준 대비
데이터만 130.1 KB 기준
데이터가 있는 범위에만 서식 131.1 KB +1.0 KB
빈 셀 47,000행까지 서식 확장 1,108.5 KB 8.5배
빈 행을 삭제하고 재저장 131.1 KB 기준 수준
사진 3장 삽입 3,456.2 KB 26.6배

눈여겨볼 곳은 두 번째 줄입니다. 3,000행 전체에 테두리와 배경색을 입혔는데 늘어난 용량이 1KB뿐입니다.

서식 자체는 거의 공짜입니다. 문제가 되는 건 서식을 어디까지 칠했느냐입니다.


값이 비어 있어도 서식이 있으면 셀은 기록으로 남습니다

서식이 왜 공짜인지부터 보겠습니다. 색이나 테두리 같은 서식의 실제 정의는

styles라는 별도 파일에 딱 한 번만 저장되고, 각 셀은 "몇 번 서식"이라는 번호만 붙여 둡니다.

위 실측에서도 styles 파일은 압축된 상태로 0.6KB에서 0.7KB로 늘었을 뿐입니다.

 

그런데 그 번호를 붙이려면 셀이 존재해야 합니다. 빈 셀까지 서식을 끌어내린 파일의 시트 내용을 직접 열어 보니 이런 기록이 4만 7천 행 남아 있었습니다.

<row r="49999">
  <c r="A49999" s="2"></c>
  <c r="B49999" s="2"></c>
  ... (H열까지 8개)
</row>

값은 하나도 없고 s="2"라는 서식 번호만 있는 셀입니다. 이런 빈 껍데기가 37만 개 넘게 쌓이면서, 시트 파일이 압축 전 기준 1.2MB에서 13MB로, 10배 넘게 불어났습니다. 마우스로 열 머리글을 클릭해 색을 칠하거나, 서식을 아래로 길게 드래그한 파일에서 흔히 벌어지는 일입니다.

 

사진은 압축이 한 번 더 되지 않습니다

사진 쪽은 사정이 다릅니다. 삽입한 3장의 원본 합계가 3,349.7KB였는데, xlsx 안에 들어간 뒤 크기는 3,324.5KB였습니다. ZIP으로 묶었는데도 0.8%밖에 줄지 않았습니다.

JPG가 이미 압축된 형식이라 더 짜낼 여지가 없기 때문입니다. 사진과 동영상을 ZIP으로 묶어도 용량이 그대로인 이유는 따로 다룬 글이 있습니다. 정리하면 엑셀에 넣은 사진은 넣은 만큼 그대로 파일 용량이 됩니다.

 

 

범인별 해결 절차

xl\worksheets가 컸다면 서식만 남은 빈 구역을 잘라 냅니다.

1. Ctrl+End를 누른다.
   커서가 데이터 마지막 행보다 한참 아래로 가면 그 아래가 문제 구역이다.
2. 데이터 마지막 행 바로 아래 행 머리글을 클릭하고
   Ctrl+Shift+아래방향키로 끝까지 선택한다.
3. 마우스 오른쪽 버튼 → [삭제]를 고른다. (Delete 키로 내용만 지우면 안 된다)
4. 오른쪽에 남은 빈 열도 같은 방식으로 삭제한다.
5. 저장하고 파일을 닫았다가 다시 연다.

3번이 핵심입니다. Delete 키는 값만 지우고 서식을 남기기 때문에 셀 기록이 그대로 남습니다. 실제로 이 정리를 적용하자 1,108.5KB 파일이 131.1KB로 되돌아왔습니다.

 

xl\media가 컸다면 엑셀 상단의 [그림 서식] 탭에서 [그림 압축]을 사용합니다. 해상도를 낮추고, 잘라낸 영역을 삭제하는 옵션을 켜면 그 부분이 실제로 파일에서 빠집니다. 더 확실한 건 넣기 전에 사진을 줄이는 쪽입니다. 해상도를 줄일지 화질을 낮출지는 앞서 실측해 비교한 글이 있습니다.

 

진단 순서는 하나입니다. 복사본을 zip으로 열어 media와 worksheets 중 무엇이 큰지 먼저 보고, 그다음에 손을 대세요.

 

파이썬이 있다면 코드 네 줄로

압축을 풀지 않고 내부 구성만 바로 확인하고 싶다면 아래 코드를 쓰면 됩니다. 표준 라이브러리만 쓰므로 설치할 것이 없습니다.

import zipfile
with zipfile.ZipFile("내파일.xlsx") as z:
    for i in sorted(z.infolist(), key=lambda x: -x.compress_size)[:10]:
        print(f"{i.compress_size/1024:9.1f} KB  {i.filename}")

큰 순서대로 10개가 나옵니다. 앞서 설명한 탐색기 방법과 결과는 같으니 편한 쪽을 고르시면 됩니다.


자주 묻는 질문

Q. 빈 행을 삭제했는데 용량이 그대로입니다.
저장한 뒤 파일을 닫았다가 다시 열어 보세요. 사용 범위는 저장 시점에 다시 계산되어서, 삭제 직후에는 Ctrl+End가 예전 위치를 가리킬 수 있습니다.

 

Q. 조건부 서식도 원인이 되나요?
됩니다. 같은 규칙을 복사해 붙여넣기를 반복하면 규칙이 수백 개로 쪼개져 쌓입니다. [홈] 탭의 [조건부 서식] → [규칙 관리]에서 목록을 열어 몇 개나 있는지 확인하고, 중복된 것은 지우면 됩니다.

 

Q. 용량이 크면 파일 여는 속도도 느려지나요?
원인에 따라 체감이 다릅니다. 사진이 많아 커진 파일은 열리고 나면 조작이 대체로 무난한 반면, 셀 기록이 부풀어 커진 파일은 스크롤과 계산까지 느려지는 편입니다.

 

 

한 가지 덧붙이면, 위 수치는 파이썬으로 저장한 파일이라,

문자열을 담는 방식 차이 때문에 엑셀 본체가 저장한 파일과 절대값은 다를 수 있습니다.

다만 "값이 없어도 서식이 있으면 셀 기록이 남는다"와 "삽입한 사진은

그대로 용량이 된다"는 xlsx 구조 자체라, 어떤 프로그램이 저장했든 방향은 같습니다.

 

지금 열려 있는 엑셀 파일이 이유 없이 무겁다면, 무엇보다 Ctrl+End부터 한 번 눌러 보세요.

커서가 엉뚱하게 멀리 가 있다면 범인은 이미 나온 셈입니다.

 

위 용량과 내부 구성 수치는 제가 케이스별로 xlsx를 직접 만들어 저장한 뒤, 압축 내부를 열어 파트별 크기를 재서 얻은 값입니다.

 

 

 

확장자가 .jsonl인데 JSON이 깨진 게 아닙니다, JSON Lines(NDJSON) 정체와 일반 JSON과의 차이

데이터를 내려받았더니 확장자가 .jsonl이거나, 메모장으로 열어 보니 줄마다 중괄호로 시작하는 객체가 따로따로 적혀 있어 당황하는 경우가 있습니다. 평소 보던 JSON처럼 맨 앞에 대괄호 [가 없

richyeon.com

 

 

받은 JSON을 엑셀로 봐야 할 때, XLSX로 변환하는 가장 깔끔한 방법

API에서 내려받은 데이터나 동료가 보내 준 파일이 .json인데, 정작 검토는 엑셀로 해야 하는 상황이 자주 생깁니다. 메모장으로 열면 중괄호와 따옴표가 빽빽해서 어디가 한 행인지조차 가늠이

richyeon.com

 

 

JSON "Expecting property name", "Expecting ',' delimiter" 오류, 증상별로 원인 찾고 고치기

JSON 파일을 읽히려는데 빨간 글씨로 이런 메시지가 뜬 적이 있을 것입니다.Expecting property name enclosed in double quotes: line 1 column 2 (char 1)Expecting ',' delimiter: line 1 column 15 (char 14)Illegal trailing comma before e

richyeon.com