Postgresql UnicodeDecodeError:&x27;ascii';编解码器可以';t位解码字节:序号不在范围内(128)

Postgresql UnicodeDecodeError:&x27;ascii';编解码器可以';t位解码字节:序号不在范围内(128),postgresql,encoding,utf-8,latin1,python-3.4,Postgresql,Encoding,Utf 8,Latin1,Python 3.4,我已经对这个错误做了一些研究,但我真的无法了解到底发生了什么。就我所知,我基本上遇到了问题,因为我正在从一种编码转换到另一种编码 def write_table_to_file(table, connection): db_table = io.StringIO() cur = connection.cursor() #pdb.set_trace() cur.copy_to(db_table, table) cur.close() return d

我已经对这个错误做了一些研究,但我真的无法了解到底发生了什么。就我所知,我基本上遇到了问题,因为我正在从一种编码转换到另一种编码

def write_table_to_file(table, connection):
    db_table = io.StringIO()
    cur = connection.cursor()
    #pdb.set_trace()
    cur.copy_to(db_table, table)
    cur.close()
    return db_tabl
这就是让我头痛的方法。下面的错误是我运行此方法时输出的

[u350932@config5290vm0 python3]$ python3 datamain.py 
Traceback (most recent call last):
  File "datamain.py", line 48, in <module>
    sys.exit(main())
  File "datamain.py", line 40, in main
    t = write_table_to_file("cms_jobdef", con_tctmsv64)
  File "datamain.py", line 19, in write_table_to_file
    cur.copy_to(db_table, table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 40: ordinal not in range(128)
数据库编码是拉丁文1

我将它们放入的数据库的编码是

S104838=# SHOW CLIENT_ENCODING;
 client_encoding
-----------------
 WIN1252
(1 row)
数据库编码是UTF8

从我发现的线程中,他们建议更改编码

To correct your function, you'll have to know what encoding the byte
string is in, and convert it to unicode using the decode() method,
and compare that result to the unicode string.

问题是,当我尝试使用解码方法时,我会收到抱怨,说它不是文件类型。我已经查看了类io.StringIO(initial_value='',newline='\n')方法的Python3.4方法,但是找不到任何关于更改编码的内容

我还发现了这一页,其中概述了问题,但我不知道我需要做什么来解决它

基本上,我很困惑到底发生了什么,不知道如何解决它。任何帮助都将不胜感激


干杯

Python3改变了围绕文本编码的文件I/O行为——我认为这是为了更好。您可能会发现信息丰富

看起来,
psycopg2
看到您传递了一个原始文件对象,并试图将它使用的字符串编码为字节序列以写入文件,假设(因为您没有指定任何其他内容)您希望对文件使用
ascii
编码

我将使用
io.BytesIO
对象而不是
StringIO
,并在执行
copy\u from
到新数据库时指定源编码


但是,如果您的
SQL\u ASCII
源数据库中的文本无效、混合或以其他方式损坏而没有问题,我会感到惊讶。

首先感谢Craig的回复。这非常有助于我认识到我需要找到一个好的方法来做这件事,否则我的新数据库中的数据将被破坏。不是我们想要的!在谷歌搜索了一段时间后,这个链接非常有用

我最终使用了StreamRecorder模块,它工作得非常好。下面是我的工作代码片段

def write_table_to_file(table, connection):
    db_table = io.BytesIO()
    cur = connection.cursor()
    cur.copy_to(codecs.StreamRecoder(db_table,codecs.getencoder('utf-8'), codecs.getdecoder('latin-1'),
                                     codecs.getreader('utf-8'), codecs.getwriter('utf-8')), table)
    cur.close()
    return db_table

长话短说,我即时将拉丁语-1转换为utf-8,一切正常,我的数据看起来不错。再次感谢您的反馈Craig:)

SQL\u ASCII更像是一种非编码。它告诉数据库存储它接收的字节,而不进行转换或验证。永远不要使用它。源数据库中可能混合了不同编码的文本。反馈您的进度是很好的,但将来如果您是提出问题的人,并且您自己没有提供最终答案,则最好将此类信息放在问题中,使其显而易见(例如,更新:)你在原来的问题上添加的内容。
def write_table_to_file(table, connection):
    db_table = io.BytesIO()
    cur = connection.cursor()
    cur.copy_to(codecs.StreamRecoder(db_table,codecs.getencoder('utf-8'), codecs.getdecoder('latin-1'),
                                     codecs.getreader('utf-8'), codecs.getwriter('utf-8')), table)
    cur.close()
    return db_table