윈도우에서 파이썬을 사용하다보면 텍스트 파일 (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 기준이다.
python 3.6.6 에서 확인했습니다.
wave 파일을 읽어서 frame수 / rate를 하면 길이가 sec으로 나옵니다.
#path_dir에 wav파일만 있다고 가정합니다.
#path_dir 에 있는 모든 파일을 읽어서 list에 넣고 length(duration)을 모두 더합니다.
import wave
import contextlib
import os
#import sys
path_dir = '드라이브:/경로/경로/' #경로 끝에 / 꼭 붙이기
file_list =os.listdir(path_dir) #경로 읽어 파일명 리스트 만들기
file_list.sort() #정렬
# 누적값 초기화
acc = 0
for i in file_list:
with contextlib.closing(wave.open(path_dir + i,'r')) as f:
frames = f.getnframes()
rate = f.getframerate()
duration = frames / float(rate)
#print(duration)
acc += duration #누적값
#결과 출력
print (acc)
# 실행화면 영상
내 얼굴을 학습 시킨 후, 비상 이미지는 실행되지 않게 하여 실행.
카메라 근처를 어슬렁거려보았다.
# 마무리
학습 데이터가 부족해서 인식률은 떨어지지만
원래 목적인 경고의 의미로는 나쁘지 않은 동작을 보인다.
- 인식률이 나쁘면 보스가 출몰하지 않았는데도 나왔다고 오인식을 해버리는 문제가;;;
그리고 사장님 얼굴을 양해하지 않고 그렇게나 많이 모을 수 있을까?
이것은 고양이 목에 방울을 다는 상황이 생각난다.
거기다가 실행 비용도 커서 항상 실행해두기는 좀 부담되는 정도 ^^;; (CPU 사용률이...)