사원 명단을 CSV로 내보낸 뒤 다시 열었더니 사번 001이 1이 되고, 우편번호 06236은 6236으로, 휴대폰 번호 앞자리 010도 사라져 있는 경우가 있습니다. 데이터를 잘못 저장한 것처럼 보여 당황하기 쉽습니다.
먼저 결론부터 말씀드리면, 값은 파일 안에 멀쩡히 남아 있습니다. 사라진 것처럼 보이는 이유는 저장이 아니라 여는 방식에 있습니다. 어디서 값이 바뀌는지 실제로 저장한 파일을 뜯어 보며 확인하겠습니다.
파일 안에는 001이 그대로 있습니다
사번, 우편번호, 전화번호가 든 표를 CSV로 저장한 뒤, 그 파일을 꾸미지 않고 원본 그대로 열어 봤습니다. 아래는 실제로 저장된 파일의 첫 다섯 줄입니다.
사번,이름,우편번호,전화
001,김서연,06236,01012345678
002,이도윤,03925,01023456789
017,박하은,48058,01034567890
128,정시우,07345,01045678901
보시는 것처럼 파일 자체에는 001도, 06236도, 앞자리 0이 붙은 전화번호도 온전히 적혀 있습니다. CSV는 값을 그냥 글자로 나열해 둔 텍스트 파일이라, 저장 단계에서 0이 지워지는 일은 없습니다.
0은 열 때 사라집니다
문제는 엑셀 같은 프로그램이 이 파일을 열 때입니다. 이들은 각 칸을 보고 숫자처럼 생겼으면 자동으로 숫자로 바꿔 읽습니다. 숫자에서 맨 앞의 0은 의미가 없으므로, 001은 1로 정리되어 버립니다.

같은 파일을 파이썬 pandas로 두 가지 방식으로 읽어 이 차이를 재현했습니다. 윈도우 11, 파이썬 3.12.10, pandas 3.0.5에서 위 4행 4열(170바이트)을 그대로 읽은 결과입니다.
열 자동 인식 dtype 첫 값(자동) 첫 값(dtype=str)
사번 int64 1 001
이름 str 김서연 김서연
우편번호 int64 6236 06236
전화 int64 1012345678 01012345678
네 열 가운데 세 열의 값이 달라졌습니다. 글자가 섞인 이름 열만 무사했습니다. 자릿수로 보면 사번은 3자에서 1자로 2자가, 우편번호는 5자에서 4자로, 전화번호는 11자에서 10자로 각각 1자가 떨어져 나갔습니다. 앞자리 0의 개수만큼 사라진 것입니다.
자동으로 형식을 인식하게 두면 사번 열이 int64, 즉 정수로 읽히는 것이 원인입니다. 정수에는 앞자리 0을 담을 자리가 없습니다.
import pandas as pd
# 자동 형식 인식 (엑셀 기본 동작과 같음)
df = pd.read_csv("employees.csv")
print(df["사번"].iloc[0]) # 1
print(df["전화"].iloc[0]) # 1012345678
print(df.dtypes["사번"]) # int64 (숫자로 읽힘)
반대로, 모든 칸을 글자로 읽으라고 알려 주면 값이 그대로 보존됩니다. pandas에서는 dtype=str 한 줄이면 됩니다.
# 모든 칸을 글자(문자열)로 읽기
df = pd.read_csv("employees.csv", dtype=str)
print(df["사번"].iloc[0]) # 001
print(df["전화"].iloc[0]) # 01012345678
같은 파일인데 결과가 달라지는 지점은 파일이 아니라 읽는 쪽의 해석입니다. 그래서 해결의 초점도 저장이 아니라 여는 방법에 맞춰야 합니다.
엑셀에서 0을 지키며 여는 법
엑셀에서 CSV를 열 때 앞자리 0을 지키는 방법은 파일을 더블클릭해 바로 여는 대신, 빈 통합 문서에서 데이터를 불러오며 각 열의 형식을 지정하는 것입니다.
1. 데이터 가져오기로 불러오기. 엑셀 상단의 데이터 탭에서 텍스트 또는 CSV 가져오기를 고르고 파일을 선택합니다. 미리 보기 창이 뜹니다.
2. 열 형식을 텍스트로. 미리 보기에서 사번, 우편번호, 전화번호처럼 0으로 시작하는 열을 텍스트 형식으로 지정한 뒤 불러옵니다. 이러면 엑셀이 그 열을 숫자로 바꾸지 않습니다.
3. 이미 열어 버렸다면. 값이 이미 1로 바뀐 상태에서 자릿수 맞추기로 0을 다시 붙이면, 표시만 채워질 뿐 원래 어떤 값이었는지는 알 수 없습니다. 이때는 원본 CSV를 위 방법으로 다시 불러오는 편이 안전합니다.
프로그램 없이 값만 눈으로 확인하고 싶다면 CSV를 메모장으로 열면 됩니다. 앞에서 봤듯 파일 자체에는 0이 남아 있어, 메모장에서는 001이 그대로 보입니다. 다만 메모장에서 한글이 깨져 보인다면 그건 앞자리 0과 다른 문제입니다. 그때는 CSV를 UTF-8로 저장하는 쪽을 먼저 확인하세요.
저장할 때 아예 막고 싶다면
내보내는 쪽을 다룰 수 있다면, 0으로 시작하는 값은 처음부터 글자로 다뤄 두는 것이 확실합니다. 파이썬으로 CSV를 만들 때 숫자가 아니라 문자열로 넣으면 어느 프로그램에서 열든 형변환 위험이 줄어듭니다.
다만 CSV 안에서는 001과 "001"이 똑같이 기록되므로, 결국 여는 쪽에서 텍스트로 읽어야 한다는 점은 같습니다. 앞자리 0이 중요한 값을 자주 다룬다면, 형식 정보를 함께 담는 XLSX로 주고받는 것이 확실합니다.
같은 4행 4열을 XLSX로 저장하고 사번, 우편번호, 전화 열의 표시 형식을 텍스트로 지정해 봤습니다. 파일은 5,070바이트가 됐고, 다시 열었을 때 001, 06236, 01012345678이 모두 그대로였습니다. CSV 170바이트에 견주면 서른 배 가까이 무겁지만, 그 안에 값과 함께 "이 칸은 글자다"라는 정보가 들어 있어 여는 쪽이 헷갈릴 일이 없습니다. 화면에 보이는 것과 안에 저장된 것이 엑셀에서 어긋나는 다른 사례도 따로 정리해 두었습니다.
자주 묻는 질문
Q. CSV로 저장하면 데이터가 손상되나요?
아닙니다. 위에서 파일 원본을 확인했듯 값은 그대로 저장됩니다. 바뀌어 보이는 건 여는 프로그램이 숫자로 해석하기 때문입니다.
Q. 날짜가 2026-04-05에서 이상한 숫자로 바뀌기도 합니다.
같은 원리입니다. 날짜처럼 생긴 칸을 프로그램이 날짜나 숫자로 자동 변환하면서 표시가 달라집니다. 해당 열도 텍스트로 지정해 불러오면 원문이 유지됩니다.
Q. 전화번호 앞 010은 왜 사라지나요?
숫자로 읽히면서 맨 앞 0이 떨어져 나가기 때문입니다. 전화번호, 사번, 우편번호는 계산하는 수가 아니라 글자에 가까우므로 텍스트로 다루는 편이 맞습니다.
핵심은 하나입니다. 0으로 시작하는 값이 있는 CSV는 더블클릭 대신 데이터 가져오기로 열고 그 열을 텍스트로 지정하세요.
'문서' 카테고리의 다른 글
| 엑셀에서 숫자로 보이는데 합계가 0으로 나올 때 (0) | 2026.09.20 |
|---|---|
| PDF인데 글자가 복사도 검색도 안 될 때, 무엇을 확인해야 할까 (0) | 2026.09.16 |
| 스캔한 계약서 PDF가 너무 무거울 때, 안에 든 사진을 다시 압축해 줄이기 (1) | 2026.09.15 |
| 중복 제거를 눌렀는데 중복이 그대로 남아 있는 이유 (0) | 2026.09.08 |
| PDF에서 검은 칠로 가린 글자, 복사하면 그대로 나옵니다 (0) | 2026.09.07 |