레이블이 csv인 게시물을 표시합니다. 모든 게시물 표시
레이블이 csv인 게시물을 표시합니다. 모든 게시물 표시

2022년 1월 24일 월요일

Python 으로 텍스트 인코딩 정보 확인하기 (Python3, 파이썬3)

윈도우에서 파이썬을 사용하다보면 텍스트 파일 (csv) 등을 읽을 때 인코딩 이슈가 자주 있다. 판다스로 csv 파일을 읽어올 때 인코딩 타입을 지정해줘야 하는데, 가끔 쓰는 툴 마다 인코딩이 달라서 에러가 발생한다. 예를 들어 MS Office Excel 은 euc-kr (cp949 로 읽을 수 있다.) 인데, 파이썬은 UTF-8 이고, 언리얼은 한글 포함된 문서 한정으로 UTF-16 이고 아닐 때는 UTF-8 이다. 판다스로 읽을 때 아래와 같이 인코딩 타입을 꼭 지정해줘야 하는데, 입력되는 소스의 인코딩이 제각각일 때는 약간 피곤하다. Notepad++ 로 읽어서 인코딩 바꿔주는것은 어렵진 않지만 많은 양을 매번 바꿀 때는 번거롭다.

data = pd.read_csv('targetFileName', delimiter=',', encoding='cp949', engine='python') #인코딩타입은 꼭 바꿔주야 한다.
그래서 귀찮을 때 나를 도와주는 파이썬에게 부탁하여 해결해보았다. 아래 코드를 사용한다.

import chardet
#import sys

# 윈도우 환경에서 cp949 텍스트 인코딩 때문에 발생하는 문제를 우회하기 위한 코드이다.

# 아래는 만일을 위해 출력하는 것 
#print(sys.stdin.encoding) #인풋 인코딩 타입
#print(sys.stdout.encoding) #아웃풋 인코딩 타입

file = ".\\확인할대상.csv" #csv 나 txt 등 텍스트 파일의 인코딩 타입을 확인하고 싶은 것의 경로를 입력한다.

def getDetectEncoding(file) :

    try:
        print("Fast Detect!!!")
        with open(file, 'r') as f:
            file_data = f.readlines() #텍스트로 읽어본다. 잘 읽히면 문제 없다. 보통 cp949 에러가 발생한다.
            f.close()
            #print(chardet.detect(file_data))
        return chardet.detect(file_data[1])['encoding'] #0번째 줄은 보통 컬럼 헤더로 정보고 1번째 줄이 실제 내용이다. 빠른 처리를 위해 1줄만 읽어본다.
    
    except:
        print ("Except!!! not UTF-8 or 16. Retry Now... ")
        with open(file, 'rb') as f:
            file_data = f.read() #cp949 에러가 발생했을 때는 그냥 파일을 바이너리로 통채로 읽는다. 용량이 클 수록 느려진다. 하지만 쉽게 해결하는 방법
            f.close()
    
    #print(chardet.detect(file_data))
    return chardet.detect(file_data)['encoding']

print(getDetectEncoding(file))
여기까지이고, 만일 판다스에서 인코딩을 자동으로 하게하려면 리턴되는 스트링을 encoiding에 바인딩 시키면 된다. 끝!! 파이썬 3.9 기준이다.