글자는 같은데 파일 비교 결과가 다를 때
명단이나 코드 목록을 텍스트 파일로 주고받다가, 글자는 같은데 비교 도구에 따라 여러 줄이 변경됐다고 표시되거나 파일 전체가 다르다고 나올 수 있습니다. 이때는 문장을 다시 입력하기 전에 줄바꿈을 기록한 방식을 확인하세요.
줄바꿈 방식이 다르다고 파일이 손상된 것은 아닙니다. 파일을 받는 프로그램이 요구하는 형식과 맞는지가 중요합니다. 원본을 보관하고 복사본에서 확인하세요. 이 글은 .txt처럼 글자만 저장하는 일반 텍스트 파일을 다룹니다. Word 문서나 PDF에 그대로 적용하는 방법은 아닙니다.
같은 코드 3줄로 파일 5개를 만들었습니다
아래 가상 코드를 UTF-8로 저장했습니다. UTF-8은 글자를 파일에 기록하는 방식입니다. 이 예제는 영문과 숫자만 사용하며 파일 앞에 붙는 문자 형식 표시인 BOM은 넣지 않았습니다.
A01
B02
C03
LF는 줄 끝에 문자 1개를 기록하는 줄바꿈입니다. CRLF는 CR과 LF라는 문자 2개를 이어서 기록합니다. 이 예제에서는 각각 1바이트와 2바이트를 차지합니다. 바이트는 파일 용량을 세는 단위입니다.
2026년10월20일 Python 3.13.1로 파일을 만든 뒤 실제 바이트를 다시 읽었습니다. 표의 ‘마지막 줄바꿈’은 C03 뒤의 줄바꿈을 뜻합니다.
| 파일 | 줄바꿈 구성 | 마지막 줄바꿈 | 용량 |
|---|---|---|---|
lf.txt |
LF 3개 | 있음 | 12바이트 |
crlf.txt |
CRLF 3개 | 있음 | 15바이트 |
mixed.txt |
첫 줄 CRLF, 나머지 LF | 있음 | 13바이트 |
no-final-newline.txt |
LF 2개 | 없음 | 11바이트 |
extra-blank-line.txt |
LF 4개 | 있음, 빈 줄도 추가 | 13바이트 |
휴대전화에서는 표를 좌우로 밀면 용량까지 확인할 수 있습니다.
CRLF를 LF로만 바꾸자 crlf.txt와 mixed.txt는 lf.txt와 바이트까지 같아졌습니다. 반면 마지막 줄바꿈이 없는 파일과 빈 줄이 추가된 파일은 여전히 달랐습니다. 줄바꿈 방식 통일과 빈 줄 정리는 별개 작업입니다.
Windows에서는 줄 끝 표시를 켜서 확인하세요
아래 단계는 Windows용 텍스트 편집기인 Notepad++의 영문 메뉴 기준입니다. Windows 기본 메모장과는 다른 프로그램입니다. 이 절차는 공식 설명서를 기준으로 작성했으며 Windows에서 직접 실행하지는 않았습니다. 이미 쓰는 편집기에 같은 기능이 있다면 그 기능을 사용해도 됩니다.
- 원본을 복사하고 복사본을 Notepad++에서 엽니다.
- View → Show Symbol → Show End of Line을 켭니다.
- 각 줄 끝의
LF또는CR·LF표시를 확인합니다. 한 파일에 둘 다 보이면 줄바꿈이 섞여 있습니다. C03뒤에도 줄 끝 표시가 있는지 확인합니다. 그 아래에 줄 끝 표시가 없는 빈 줄 번호만 보이면 마지막 줄바꿈이 있는 상태입니다. 그 빈 줄에 줄 끝 표시가 또 있으면 빈 줄이 추가된 상태입니다.
이 기능은 줄 끝 문자를 눈에 보이게 표시합니다. 표시를 켜는 것만으로 파일 내용이 바뀌지는 않습니다. 메뉴와 표시 방식은 Notepad++ 공식 설명서의 보기 항목을 기준으로 작성했습니다. 상태 표시줄에는 한 가지 줄바꿈 종류만 나타나므로, 섞여 있는지는 각 줄의 줄 끝 표시로 확인하세요.
예제를 열어 보려면 아래 링크를 오른쪽 클릭해 링크를 다른 이름으로 저장하세요. 화면에 열린 글자를 복사하면 줄바꿈이 달라질 수 있습니다. 휴대전화에서는 먼저 글을 읽고, 편집 작업은 파일을 저장한 PC에서 진행하세요.
받는 프로그램의 요구에 맞춰 복사본을 바꾸세요
파일을 받는 곳에서 LF 또는 CRLF를 지정했다면 그 형식을 따르세요. 요구가 없고 정상적으로 읽힌다면 굳이 바꿀 필요는 없습니다.
Notepad++에서는 Edit → EOL Conversion → Unix (LF) 또는 Windows (CR LF)로 파일 전체의 줄바꿈을 통일할 수 있습니다. EOL은 줄의 끝을 뜻합니다. 목표 항목이 회색으로 비활성화돼 있는데 줄바꿈이 섞여 있다면, 다른 방식을 한 번 선택한 뒤 목표 방식을 다시 선택하세요. 이 절차는 공식 설명서의 줄바꿈 변환 안내에 나옵니다.
변경한 복사본을 저장하고 닫았다가 다시 열어 보세요. 줄 끝 표시가 통일됐는지 확인하고, 파일을 받을 프로그램에서도 코드 3개가 각각 한 줄로 들어가는지 확인합니다. 저장할 때 문자 저장 방식까지 함께 바꾸지 마세요. 한글이 깨지는 문제는 CSV 한글 인코딩 확인 방법에서 설명한 것처럼 별도 원인을 살펴야 합니다.
마지막 줄바꿈을 추가할지는 받는 프로그램의 규칙에 맞춰 따로 결정하세요. C03 뒤에서 Enter를 한 번 누르면 마지막 줄바꿈이 생깁니다. 거기서 Enter를 한 번 더 누르면 빈 줄까지 추가됩니다. 자동 줄바꿈으로 화면에서만 접힌 줄은 이 줄 끝 표시와 구분하세요.
줄 수를 세는 코드도 확인해야 합니다
파일을 읽는 쪽의 처리 방식 때문에 빈 항목이 생길 수도 있습니다. 실험에서는 파일의 바이트를 read_bytes().decode('utf-8')로 읽어 줄 끝 문자를 그대로 보존했습니다. CRLF 파일의 문자열을 Python의 text.split('\n')으로 나누자 첫 항목은 A01이 아니라 A01\r로 남았습니다. 여기서 \n은 LF, \r은 CR을 나타내는 코드 표기입니다. LF 파일도 split('\n')으로 나누면 마지막 줄바꿈 뒤에 빈 항목이 생겨 4개가 됩니다. 파일을 바꿔야만 해결되는 문제는 아닙니다.
같은 파일을 text.splitlines()로 나누자 A01, B02, C03이라는 3개 항목이 나왔습니다. 마지막 줄바꿈만 있는 LF 파일도 3개였고, 빈 줄을 하나 더 넣은 파일은 마지막에 빈 항목이 생겨 4개였습니다. Python의 이 함수는 마지막 줄바꿈만으로 빈 항목을 추가하지 않습니다. Python 공식 줄 나누기 설명
Python의 기본 텍스트 읽기인 open()의 newline=None은 CRLF를 LF로 바꿔 읽습니다. 따라서 같은 파일이어도 읽는 방법에 따라 split('\n') 결과가 달라집니다. Python 공식 파일 읽기 안내
이 결과를 모든 프로그램의 줄 수 규칙으로 볼 수는 없습니다. 명단을 읽는 코드를 관리한다면 줄바꿈 처리와 빈 줄 처리 규칙을 각각 확인하세요. 빈 항목을 없애려고 파일 전체의 공백을 무조건 지우면 필요한 공백까지 잃을 수 있습니다.
측정 범위와 재현 자료
실험은 macOS에서 Python으로 실행했습니다. 파일 생성·바이트 수·줄 끝 문자 수·줄 나누기 결과·줄바꿈 통일 후 일치 여부를 확인했습니다. 특정 업로드 서비스나 Windows 편집기의 실행 결과를 측정한 것은 아닙니다.
전체 측정 기록에 파일별 결과와 SHA-256을 담았습니다. SHA-256은 파일 내용으로 계산하는 비교용 값입니다. 두 파일이 바이트까지 같은지 확인하는 명령은 파일 해시 비교 글을 참고하세요. 이번 글은 그 비교에서 차이를 발견한 뒤 줄바꿈 원인을 찾고 고치는 단계에 초점을 맞췄습니다.
재현 코드는 공개 저장소의 scripts/generate_blog_line_ending_examples.py입니다. 저장소 폴더에서 다음 명령을 실행하면 예제 5개와 측정 기록을 다시 만듭니다.
python3 scripts/generate_blog_line_ending_examples.py
원본 자료는 바이트를 보존하도록 관리하며 재실행하면 측정 시각과 실행 환경이 갱신됩니다.
함께 읽어보세요
- 데이터·텍스트
직접 만든 JSON 예제7개로 문법 오류를 비교했습니다. 마지막 쉼표와 빠진 쉼표를 구분하고, JSON과 주석을 허용하는 설정 파일의 차이를 확인하세요.
- 데이터·텍스트
00123 같은 코드와 16자리 이상 숫자를 CSV에서 스프레드시트로 가져올 때 바뀌는 이유와, 열을 텍스트로 보존하는 방법을 정리했습니다.
- 데이터·텍스트
쉼표와 줄바꿈이 들어간 가상 명단을 CSV로 저장했습니다. 정상 파일과 따옴표가 빠진 파일을 비교하고, 표가 어긋났을 때 확인할 순서를 설명합니다.
- 데이터·텍스트
같은 표를 UTF-8, BOM을 넣은 UTF-8, CP949로 저장했습니다. 예제3개로 한글 깨짐의 원인과 다시 불러오는 순서를 확인하세요.