Python DB数据的字符串编码/解码问题

Python DB数据的字符串编码/解码问题,python,python-3.x,Python,Python 3.x,我正在编写一个脚本,将数据从Oracle数据库ETL到PostgreSQL。我正在使用jaydebeapi连接到Oracle和PSQL的psycopy2。我通过将数据流式传输到copy_from函数将数据加载到PSQL中——这对于MySQL数据库中的my ETL非常有效。我对一个字符串有点问题,但我相信它们可能是其他字符串。我有一个函数,它计算Oracle结果集中的每个字段,如果是字符串,则将其清除。在源数据库中,Doña Ana存储在county表中,但它存储为Do\xf1a Ana,因此当我

我正在编写一个脚本,将数据从Oracle数据库ETL到PostgreSQL。我正在使用jaydebeapi连接到Oracle和PSQL的psycopy2。我通过将数据流式传输到
copy_from
函数将数据加载到PSQL中——这对于MySQL数据库中的my ETL非常有效。我对一个字符串有点问题,但我相信它们可能是其他字符串。我有一个函数,它计算Oracle结果集中的每个字段,如果是字符串,则将其清除。在源数据库中,
Doña Ana
存储在county表中,但它存储为
Do\xf1a Ana
,因此当我尝试在PSQL中加载它时,它抛出:

invalid byte sequence for encoding "UTF8": 0xf1 0x61 0x20 0x41 
导入六个
导入Unicode数据
def预处理数据(值):
encodedvalue=bytearray(值“utf-8”)
打印(编码值)
decodedvalue=encodedvalue.decode('utf-8')
打印(解码值)
cleanedvalue=unicodedata.normalize(u'NFD',decodedvalue.encode('ASCII','ignore')。decode('utf-8'))
打印(清除值)
返回cleanedvalue
输出:

b'Do\\xf1a Ana'                                                                  
Do\xf1a Ana
Do\xf1a Ana                                                                      
看起来,当我尝试编码
Do\xf1a Ana
时,它只是在逃避后格,而不是转换它

当我尝试使用解释器规范化字符串时:

>>> x = 'Do\xf1a Ana'
>>> x
'Doña Ana'
>>> p = bytearray(x,'utf-8')
>>> p
bytearray(b'Do\xc3\xb1a Ana')
>>> a = p.decode('utf-8')
>>> a
'Doña Ana'
>>> normal = unicodedata.normalize('NFKD', a).encode('ASCII', 'ignore').decode('utf-8')
>>> normal
'Dona Ana'

有人能解释发生了什么事吗?显然,来自数据库的值与它有关,即使它被认为是一个
str

我能够在对字符串进行初始编码并将其转换为字节后,使用“unicode_escape”解码来完成这项工作

def预处理数据(值):
encodedvalue=value.encode()
decodedvalue=encodedvalue.decode('unicode_escape'))
cleanedvalue=decodedvalue.replace(“\r”和“”)
#下面还列出了发生的其他事情
#正在清理可能导致“\n”等问题的字符串。
返回cleanedvalue

那么您的代码在解释器中工作正常?你在哪一行得到错误?我对您的所有代码进行了rand,它在我的解释器中工作。是的,在解释器中工作正常,但当我使用数据库中的实际数据运行脚本时,它会以“Do\xf1a Ana”值失败。在这种情况下,当它试图将数据加载到PSQL中时失败-数据库编码为UTF-8。我不完全理解编码/解码的内容,但我相信数据库应该接受带有波浪号的字母“n”。