텍스트 파일이 줄마다 다르게 비교될 때: LF·CRLF와 마지막 빈 줄 확인하기

같은 코드 3줄을 줄바꿈만 바꿔 저장했습니다. 섞인 줄바꿈, 마지막 줄바꿈, 빈 줄을 구분하고 복사본에서 고치는 방법을 설명합니다.

뒤로가기

글자는 같은데 파일 비교 결과가 다를 때

명단이나 코드 목록을 텍스트 파일로 주고받다가, 글자는 같은데 비교 도구에 따라 여러 줄이 변경됐다고 표시되거나 파일 전체가 다르다고 나올 수 있습니다. 이때는 문장을 다시 입력하기 전에 줄바꿈을 기록한 방식을 확인하세요.

줄바꿈 방식이 다르다고 파일이 손상된 것은 아닙니다. 파일을 받는 프로그램이 요구하는 형식과 맞는지가 중요합니다. 원본을 보관하고 복사본에서 확인하세요. 이 글은 .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에서 직접 실행하지는 않았습니다. 이미 쓰는 편집기에 같은 기능이 있다면 그 기능을 사용해도 됩니다.

  1. 원본을 복사하고 복사본을 Notepad++에서 엽니다.
  2. View → Show Symbol → Show End of Line을 켭니다.
  3. 각 줄 끝의 LF 또는 CR·LF 표시를 확인합니다. 한 파일에 둘 다 보이면 줄바꿈이 섞여 있습니다.
  4. 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

원본 자료는 바이트를 보존하도록 관리하며 재실행하면 측정 시각과 실행 환경이 갱신됩니다.