0

我正在将数据加载到以 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用于西欧语言,应该能够处理所有这些特殊字符。是否有适用于所有这些语言的替代编码?还是我需要根据处理的值更改编码?

4

1 回答 1

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')

如果它不适用于所有输入,您可能必须参数化编码并为每个输入文件相应地设置它。

于 2017-04-10T20:42:05.227 回答