postgresql - Unicode解码错误: 'ascii' codec can't decode byte in position : ordinal not in range(128)

标签 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 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)

我从中检索表的数据库上的客户端编码是

tctmsv64=> SHOW CLIENT_ENCODING;
 client_encoding
-----------------
 sql_ascii
(1 row)

数据库编码为LATIN1

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

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.

http://www.thecodingforums.com/threads/unicodedecodeerror-ascii-codec-cant-decode-byte-0xa0-in-position-10-ordinal-not-in-range-128.336691/

问题是当我尝试使用解码方法时,我收到投诉说它不是文件类型。我查看了类 io.StringIO(initial_value='', newline='\n')¶ 方法的 python 3.4 方法,但在更改编码时找不到任何内容。

我也找到了这个概述问题的页面,但我无法弄清楚我需要做什么来解决它

https://wiki.python.org/moin/UnicodeDecodeError

基本上我对发生了什么感到很困惑,也不确定如何解决它。任何帮助将不胜感激。

干杯

最佳答案

Python 3 改变了围绕文本编码的文件 I/O 行为 - 在我看来,这是为了更好。你可能会发现 Processing Text Files in Python 3内容丰富。

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

我会使用 io.BytesIO 对象而不是 StringIO,并在您对新文件执行 copy_from 时指定源编码数据库。

不过,如果您没有因来自 SQL_ASCII 源数据库的无效、混合或其他乏味文本而遇到问题,我会感到惊讶。

关于postgresql - Unicode解码错误: 'ascii' codec can't decode byte in position : ordinal not in range(128),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24400582/

相关文章:

python - 卡夫卡与 python : How to send topic to postgreSQL?

Python:讨论站点的哪些模块?

node.js - 在 Angular 和 Node Js postgreSQL 中登录

php - 处理/删除 UTF-8 从右到左覆盖字符的最佳方法是什么?

python - 在python 3中将转义的utf-8字符串转换为utf

python - 在 python 中检测支持 Unicode 的键盘输入

c++ - Qt QSqlDatabase 和 QSqlTableModel 与 PostgreSQL View 的兼容性?

javascript - 我如何在 JavaScript 和 Python 中对 unicode 字符串进行 base64 编码?

windows - 运行以 utf-8 保存的 scala 脚本会出错

附加到末尾时文件中间的python utf-8-sig BOM