본문 바로가기
IT, Software/Python

Python UTF-8 파일 처리 중 BOM 출력 오류 해결

by 기타마을이장 2021. 2. 22.

텍스트 분할기를 만들다 보니 역시 텍스트 관련 프로그램에서 늘 접하게 되는 인코딩 오류를 접하게 됐다.

그래서 사실 프로그램에서 파일을 열면 첫 100줄정도를 읽어서

텍스트 첫부분이라도 어떤 형태로 인코딩 된 건지를 알아보도록 기능을 넣기는 했다.

 

UTF-8 BOM 출력 오류

텍스트를 분할하기 위해 원본 파일을 읽어 왔다.

흔히들 많이 쓰이는 코드를 사용했다.

with open(filename, mode="r", encoding="utf-8") as file:
	return file.readlines()

그런데 readlines()로 가져온 결과물들을 처리하는 부분에서 exception 이 발생했었다.

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)

이유는 윈도우에서 utf-8로 텍스트 파일을 작성하면 파일의 가장 첫 부분에 bom(byte order mask)를 자동으로 붙이는데, 이 bom을 출력하려고 하니 문제가 발생하는 거라고 한다.

해결방법 1

가장 간단한 방법으로 파일을 열 때 encoding 파라미터다 utf-8-sig 를 지정해준다.

with open(filename, mode="r", encoding="utf-8-sig") as file:

해결방법 2

utf-8로 파일을 읽고, 파일의 첫 부분에 bom이 있을 경우 이를 제거한다.

유닉스 계열의 텍스트 편집기는 bom을 사용하지 않는 경우가 많다고 하니, 유닉스 계열 파일 처리할 때도 같이 사용 가능할 것 같아 좋은 방법이라 생각된다.

실제로 해당 코드를 적용해서 회차분할기를 완성해놓은 상태이다.

with open(filename, mode="r", encoding="utf-8") as file:
	lines = file.readlines()
	if len(lines) != 0:
		lines[0] = lines[0].replace(u"\ufeff", '')

둘 다 좋은 방법 같다.

반응형

댓글