2017-04-08 6 views
0

이름, 성 및 주소를 포함한 개인 정보가 포함 된 utf-8로 인코딩 된 postgresdwh에 데이터를로드하고 있습니다. 이 값은 umlauts과 같은 독일어 문자와 é, â, à 등의 프랑스어 문자를 가질 수 있습니다. 데이터는 Excel 파일에서 데이터 프레임으로 읽은 다음 postgresql 데이터베이스로 푸시됩니다. 이전에 다음 줄을 사용하여 인코딩 오류를 피했습니다. 그래서 이름 값에 대한 예를 들어 : 다른 오류를 제기Python 인코딩 인 이름

지금 만난
df = pd.read_excel(dir_path, encoding='utf-8-sig') 

df['fname'] = df['fname'].apply(lambda x: x.encode('windows-1252')) 

프랑스어 문자 :

df['fname'] = df['fname'].apply(lambda x: x.encode('utf-8-sig')) 

:

DataError('(psycopg2.DataError) invalid byte sequence for encoding "UTF8": 0xe9 0x20 0x20 

나는에 인코딩을 변경했습니다 그러나 스크립트를 그대로두면 독일어 문자로 값이로드되지 않습니다. 나는 Wester-European 언어에 windows-1252이 사용되었다고 생각하고 모든 특수 문자를 처리 할 수 ​​있어야합니다. 이러한 모든 언어에 적용 할 대체 인코딩이 있습니까? 또는 처리 된 값을 기반으로 인코딩을 변경해야합니까?

+0

** 해당 ** 코드 줄을 ** DataError (** ** 읽기, [최소, 완전하고 검증 가능한 예제 작성 방법] [1]에 표시하고 이에 따라 질문을 편집하여 질문을 편집하십시오. [1] : https://stackoverflow.com/help/mcve – stovfl

답변

1

는 DataError 한 것은 분명하다, 어디에서 오는지 당신이 표시되지 않더라도 : "잘못된 바이트 시퀀스"문제는 확실히 데이터가 을 디코딩있는 위치에 연결되어 있지 인코딩.

따라서 표시하는 두 줄이 인코딩과 관련된 모든 것이라면 첫 번째 예외 (pd.read_excel)에서 예외가 발생합니다. 으로 인코딩 할 때 람다 식의 두 번째 줄처럼 잘못된 바이트 시퀀스와 관련된 문제를받을 수 없습니다.

분명히 입력이 이 아니라이 BOM을 포함하거나 포함하지 않는 것으로 보입니다. 확인 : 실제 인코딩 주어진 정보 (프랑스와 독일 문자 순서 b'\xe9\x20\x20', 윈도우), 좋은 추측을 기반으로하지만

>>> b'\xe9\x20\x20'.decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 0: invalid continuation byte 

는 CP-1252 또는 라틴-9 (ISO 8859-15)이다 . 그들 모두에서, 결과는 동일합니다 : 그것은 모든 입력이 작동하지 않는 경우

df = pd.read_excel(dir_path, encoding='windows-1252') 

, 당신은 아마 인코딩을 parametrise해야하고 : 그래서

>>> b'\xe9\x20\x20'.decode('cp1252') 
'é ' 
>>> b'\xe9\x20\x20'.decode('latin9') 
'é ' 

이 시도 각 입력 파일에 맞게 설정하십시오.