시스템에서 1년치 거래 내역을 CSV로 내려받았습니다. 파일은 17메가바이트 남짓이고, 더블클릭하면 엑셀이 뜨긴 뜹니다. 그런데 맨 아래로 내려가 보면 마지막 날짜가 12월이 아닙니다.
엑셀이 고장 난 것이 아니라 시트 한 장이 담을 수 있는 행이 1,048,576개로 정해져 있기 때문입니다. 그 선을 넘긴 CSV를 만들어 어디까지 들어오고 무엇이 남는지 직접 재 봤습니다.

제한은 CSV가 아니라 시트 쪽에 있습니다
먼저 짚어 둘 것이 있습니다. CSV는 줄바꿈으로 행을 구분하는 순수한 텍스트 파일이라 줄 수에 상한이 없습니다. 1,100,000행짜리 파일을 만들어 세어 보니 정확히 1,100,000행이 들어 있었습니다.
| 다루는 방법 | 담기는 행 | 걸린 시간 | 결과 |
|---|---|---|---|
| CSV 파일에 담긴 원본 | 1,100,000 | 242 ms | 줄 수 제한 없음 |
| 엑셀 시트 한 장의 상한 | 1,048,576 | 51,424행 초과 | |
| pandas로 읽기 | 1,100,000 | 1,425 ms | 전량 들어옴 |
같은 파일인데 담는 그릇에 따라 갈립니다. 잘려 나간 51,424행은 파일에서 지워진 것이 아니라 시트에 자리가 없어 못 올라간 것입니다. 원본 CSV에는 그대로 남아 있습니다.
이 숫자는 규격에 적힌 값입니다
1,048,576은 2의 20제곱입니다. xlsx 형식이 행 번호에 쓸 수 있는 자리를 그만큼으로 정해 두었습니다. 그래서 엑셀뿐 아니라 같은 형식을 다루는 다른 도구도 같은 지점에서 멈춥니다. 파이썬에서 그 다음 행에 값을 쓰려고 하면 이렇게 거부합니다.
ValueError: Row numbers must be between 1 and 1048576.
Row number supplied was 1048577
도구가 다른데 한계가 같다는 것은 이것이 프로그램의 성능 문제가 아니라 형식의 약속이라는 뜻입니다. 더 좋은 컴퓨터를 쓴다고 늘어나지 않습니다.
열 쪽에도 상한이 있습니다
같은 규격이 열의 개수도 정해 두었습니다. 한 시트의 열은 16,384개까지이고 마지막 열의 이름이 XFD 입니다. 2의 14제곱입니다.
다만 여기서 행과 다른 점이 하나 있습니다. 행은 한계를 넘기면 도구가 막아 주는데, 열은 막아 주지 않았습니다. 파이썬으로 16,385번째 열에 값을 넣어 보니 오류 없이 XFE 라는 이름으로 만들어졌습니다. 규격에 없는 이름이라 엑셀에서 정상적으로 열린다고 보기 어렵습니다. 열이 아주 많은 자료를 프로그램으로 저장할 때 더 조심해야 하는 이유입니다.
열기 전에 0.2초만 쓰면 됩니다
가장 확실한 대비는 열기 전에 줄 수를 세어 보는 것입니다. 17메가바이트 파일에서 242밀리초가 걸렸습니다.
LIMIT = 1_048_576
path = r"C:\경로\거래내역.csv"
with open(path, "rb") as f:
rows = sum(1 for _ in f) - 1 # 헤더 한 줄 빼기
print(f"데이터 {rows:,}행")
if rows > LIMIT:
print(f"시트 한 장에 {rows - LIMIT:,}행이 못 들어갑니다")
넘친다면 상한에 맞춰 두 개로 나눕니다. 위 파일을 나누는 데 1.2초가 걸렸고, 1,048,576행짜리와 51,424행짜리 두 파일이 됐습니다. 나눠서 볼 일이 아니라 전부를 한 번에 다뤄야 한다면 엑셀 밖으로 나가는 편이 낫습니다. 수백만 행 CSV를 빠르게 읽는 방법이나 SQLite에 넣고 조회하는 방법이 그 경우를 위한 것입니다. 시트를 여러 장으로 나눠 저장할 때 생기는 일은 엑셀을 CSV로 내보낼 때의 문제에서 따로 다뤘습니다.
큰 CSV를 받았다면 더블클릭하기 전에 줄 수부터 세어 보세요. 0.2초면 끝나는 확인이 뒤늦게 자료가 비었다는 것을 알아차리는 일을 막아 줍니다.
위 행 수와 시간은 윈도우 11에서 파이썬 3.14.6, pandas 3.0.5, openpyxl 3.1.5으로 같은 CSV 한 개를 방법만 바꿔 다뤄 얻은 값입니다. 엑셀 프로그램으로 직접 열어 확인하는 것은 이번 측정에 넣지 않았습니다. 1,048,576이라는 상한은 xlsx 형식의 규격값이고, 같은 지점에서 openpyxl이 거부하는 것으로 확인했습니다.
'데이터' 카테고리의 다른 글
| 시트가 5장인 엑셀을 CSV로 저장했더니 4장이 사라졌습니다 (0) | 2026.09.18 |
|---|---|
| 맥에서 받은 파일 이름이 ㅎㅏㄴㄱㅡㄹ 처럼 벌어져 보일 때 (0) | 2026.09.09 |
| 큰 CSV를 엑셀 대신 SQL로 다루기, SQLite에 불러와 조회하는 방법 (0) | 2026.07.25 |
| 커진 CSV를 gzip으로 압축하기, 얼마나 줄고 압축한 채로 바로 읽을 수 있을까? (0) | 2026.07.24 |
| 중첩된 JSON을 엑셀에서 열리는 CSV로, 배열까지 한 줄씩 펼쳐 변환하기 (0) | 2026.07.22 |