본문 바로가기
프로젝트

데이터 전처리 과정에서 발생한 csv 파일 인코딩 이슈 해결법

by 포 키 2023. 9. 13.
728x90

 

 

2019년도 통계에 대한 데이터 전처리는 오전에 끝냈지만, 추가적으로 당시 요금과 관련한 한글문서 파일을 찾았다.

정확하게는 관광지 입장료에 대한 요금 파일을 찾았다.

그래서 이 파일을 csv로 저장해서 무료인데 결측치로 되어있던 부분을 문서 자체에서 수정을 했다.

분명 csv 파일로 변환하면서 따로 건드린 것도 없는데 인코딩 이슈가 났다.

 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 27: invalid start byte

 

찾아보니 인코딩이 'utf-8' 이 아니어서 나는 오류였다.

그래서 해결 방법을 열심히 찾아봤다.

pandas를 사용할 때, 코드 오류도 딱히 없었기 때문에 이 부분은 문제가 되지 않았고 인코딩을 변경시키는 것이 답이었다.

 

해결방법!!

인코딩을 변경해주기만 하면 간단하게 해결되는 문제이다!

그런데 나는 내가 작성한 문서도 아니다보니 현재 인코딩 상태를 모르겠어서 현재 인코딩 상태를 먼저 찾아야 했다.

그래서 현재 인코딩 상태를 찾고, 인코딩을 바꿀 수 있도록 코드를 설정했다. (물론 열심히 서칭했다! ㅋㅋㅋㅋ)

 

로컬에서 사용가능한 방법

import chardet
import pandas as pd

# 파일 이름
input_filename = '원본파일.csv'

# 파일의 인코딩을 감지
with open(input_filename, 'rb') as f:
    result = chardet.detect(f.read())

# 감지된 인코딩 출력
detected_encoding = result['encoding']
print(f"Detected Encoding: {detected_encoding}")

# 파일을 읽고 새로운 인코딩으로 저장
df = pd.read_csv(input_filename, encoding=detected_encoding)
output_filename = '새로운파일.csv'
df.to_csv(output_filename, encoding='utf-8', index=False)

print(f"File converted to 'utf-8' and saved as {output_filename}")

 

구글 코랩에서 사용가능한 방법

# 먼저 해당 파일이 저장된 구글 드라이브와 연동시키기
from google.colab import drive
drive.mount('/content/drive')

# 이 후 코드
import chardet
import pandas as pd

# Google 드라이브 경로에서 파일 읽기
drive_path = "/content/drive/My Drive/"  # Google 드라이브 경로
input_filename = drive_path + '원본파일.csv'

# 파일의 인코딩을 감지
with open(input_filename, 'rb') as f:
    result = chardet.detect(f.read())

# 감지된 인코딩 출력
detected_encoding = result['encoding']
print(f"Detected Encoding: {detected_encoding}")

# 파일을 읽고 새로운 인코딩으로 저장
df = pd.read_csv(input_filename, encoding=detected_encoding)
output_filename = drive_path + '새로운파일.csv'
df.to_csv(output_filename, encoding='utf-8', index=False)

print(f"File converted to 'utf-8' and saved as {output_filename}")

 

 

이 코드를 사용해서 인코딩을 새로입힌 파일이다!!

 

 

새로 인코딩이 입혀진 파일을 통해 데이터 프레임으로 불러오고, 전처리까지 끝낸 상태다!

 

이렇게 오늘도 또 하나를 배울 수 있는 시간이었다.

728x90