use*_*637 2 python postgresql encoding utf python-2.7
我正在尝试使用Python在StringIO对象中写入数据,然后最终使用psycopg2的copy_from()函数将此数据加载到postgres数据库中.
首先,当我这样做时,copy_from()抛出一个错误:错误:编码"UTF8"的无效字节序列:0xc92所以我遵循了这个问题.
我发现我的Postgres数据库有UTF8编码.
我正在编写数据的文件/ StringIO对象显示其编码如下:setgid非ISO扩展ASCII英文文本,带有很长的行,带有CRLF行终止符
我试图将我写入中间文件/ StringIO对象的每个字符串编码为UTF8格式.要做到这一点,每个字符串使用.encode(encoding ='UTF-8',errors ='strict')).
这是我现在得到的错误:UnicodeDecodeError:'ascii'编解码器无法解码位置47的字节0x92:序号不在范围内(128)
这是什么意思?我如何解决它?
编辑:我正在使用Python 2.7我的一些代码:
我从MySQL数据库中读取了根据MySQL Workbench以UTF-8编码的数据.这是用于将我的数据(从MySQL db获得)写入StringIO对象的几行代码:
# Populate the table_data variable with rows delimited by \n and columns delimited by \t
row_num=0
for row in cursor.fetchall() :
# Separate rows in a table by new line delimiter
if(row_num!=0):
table_data.write("\n")
col_num=0
for cell in row:
# Separate cells in a row by tab delimiter
if(col_num!=0):
table_data.write("\t")
table_data.write(cell.encode(encoding='UTF-8',errors='strict'))
col_num = col_num+1
row_num = row_num+1
Run Code Online (Sandbox Code Playgroud)
这是从我的StringIO对象table_data写入Postgres数据库的代码:
cursor = db_connection.cursor()
cursor.copy_from(table_data, <postgres_table_name>)
Run Code Online (Sandbox Code Playgroud)
问题是你正在调用encode一个str对象.
A str是一个字节字符串,通常表示以某种方式编码的文本,如UTF-8.当您调用encode它时,首先必须将其解码回文本,以便可以重新编码文本.默认情况下,Python通过调用来执行此操作s.decode(sys.getgetdefaultencoding()),并且getdefaultencoding()通常会返回'ascii'.
所以,你说的是UTF-8编码的文本,将其解码为ASCII,然后以UTF-8重新编码.
一般的解决方案是decode使用正确的编码显式调用,而不是让Python使用默认值,然后encode是结果.
但是当正确的编码已经是你想要的那个时,更简单的解决方案就是跳过.decode('utf-8').encode('utf-8')并只使用UTF-8 str作为str它已经存在的UTF-8 .
或者,如果你的MySQL包装有一个功能,让你指定的编码,并取回unicode值CHAR/ VARCHAR/ TEXT列,而不是str值(例如,在MySQLdb的,你传递use_unicode=True给connect呼叫,或者charset='UTF-8'如果你的数据库是太旧,自动-检测它,就这样做.然后你会有unicode对象,你可以打电话.encode('utf-8')给他们.
一般来说,处理Unicode问题的最佳方法是最后一个 - 尽可能早地解码所有内容,以Unicode进行所有处理,然后尽可能晚地进行编码.但不管怎样,你必须保持一致.不要打电话给str可能是的东西unicode; 不要将str文字连接到a unicode或将其传递给它的replace方法; 每当你混合搭配时,Python就会使用你的默认编码为你隐式转换,这几乎不是你想要的.
作为旁注,这是Python 3.x的Unicode更改帮助的许多内容之一.首先,str现在是Unicode文本,而不是编码字节.更重要的是,如果你有编码的字节,例如,在一个bytes对象中,调用encode将给你一个AttributeError而不是尝试静默解码,所以它可以重新编码.而且,类似地,尝试混合和匹配Unicode和字节将给你一个明显的TypeError,而不是在某些情况下成功的隐式转换,并提供关于你没有在其他情况下要求的编码或解码的神秘消息.
| 归档时间: |
|
| 查看次数: |
17369 次 |
| 最近记录: |