我将数据加载到以utf-8编码的postgresdwh中,其中包括个人信息 - 包括名字,姓氏和地址。这些值可以包含umlauts
等德语字符以及é, â, à
等法语字符。数据正在从Excel文件中读取到数据帧中,然后推送到postgresql数据库中。
我之前使用过以下行来规避编码错误。例如,对名字值:
df = pd.read_excel(dir_path, encoding='utf-8-sig')
df['fname'] = df['fname'].apply(lambda x: x.encode('windows-1252'))
我现在遇到的法语字符引发了另一个错误:
DataError('(psycopg2.DataError) invalid byte sequence for encoding "UTF8": 0xe9 0x20 0x20
我已将编码更改为:
df['fname'] = df['fname'].apply(lambda x: x.encode('utf-8-sig'))
但是,保留脚本不会加载带有德语字符的值。
我认为windows-1252
用于Wester-European语言,应该能够处理所有这些特殊字符。
是否有适用于所有这些语言的替代编码?或者我是否需要根据处理的值更改编码?
答案 0 :(得分:1)
即使你没有显示DataError的来源,有一件事是清楚的:“无效的字节序列”问题肯定是连接到数据被解码的位置,而不是编码
因此,如果您显示的两行是与编码相关的所有内容,则异常发生在第一行(pd.read_excel
)中。
编码时,无法收到与无效字节序列相关的问题,如第二行(在lambda表达式中)。
显然,特定输入不以UTF-8编码(带或不带BOM)。 确认:
>>> 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
但是,根据给出的信息(法语和德语字符,序列b'\xe9\x20\x20'
,Windows),对实际编码的良好猜测是CP-1252或Latin-9(ISO 8859-15)。在两者中,结果都是一样的:
>>> b'\xe9\x20\x20'.decode('cp1252')
'é '
>>> b'\xe9\x20\x20'.decode('latin9')
'é '
所以,试试这个:
df = pd.read_excel(dir_path, encoding='windows-1252')
如果它不适用于所有输入,则可能必须对编码进行参数化并为每个输入文件进行相应的设置。