UnicodeEncodeError:'ascii' 编解码器无法编码字符 u'\u2019',位置 47:序号不在范围(128)内

6 投票
1 回答
21247 浏览
提问于 2025-04-30 11:44

我正在使用 Python 2.7 和 MySQLdb 1.2.3。我尝试了在 StackOverflow 和其他论坛上找到的所有方法来解决我脚本中出现的编码错误。

我的脚本从一个源 MySQL 数据库的所有表中读取数据,然后把这些数据写入一个 Python 的 StringIO.StringIO 对象中,接着再通过 psycopg2 库的 copy_from 命令把这些数据从 StringIO 对象加载到 Postgres 数据库(这个数据库显然是用 UTF-8 编码格式的。我是通过在 pgadmin 中查看数据库的属性和定义找到这一点的)。

我发现我的源 MySQL 数据库有些表是用 latin1_swedish_ci 编码的,而其他表则是用 utf_8 编码格式的(我从 information_schema.tables 的 TABLE_COLLATION 中发现的)。

我在我的 Python 脚本顶部写了这些代码,都是根据我在网上的研究写的。

db_conn = MySQLdb.connect(host=host,user=user,passwd=passwd,db=db, charset="utf8", init_command='SET NAMES UTF8' ,use_unicode=True) 
db_conn.set_character_set('utf8') 
db_conn_cursor = db_conn.cursor()
db_conn_cursor.execute('SET NAMES utf8;')
db_conn_cursor.execute('SET CHARACTER SET utf8;')
db_conn_cursor.execute('SET character_set_connection=utf8;')

我在这一行代码中仍然遇到 UnicodeEncodeError 错误:cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #去掉列值中的不必要字符

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 47: ordinal not in range(128)

我写了以下代码来清理源 MySQL 数据库中每个表的单元格数据,在写入 StringIO 对象时使用。

cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value

请帮帮我。

暂无标签

1 个回答

11

str(cell) 是在尝试把 cell 转换成 ASCII 格式。ASCII 只支持序号小于 255 的字符。那么,cell 到底是什么呢?

如果 cell 是一个 Unicode 字符串,那你只需要用 cell.encode("utf8"),这样就能把它转换成 UTF-8 编码的字节串。

...或者我记得没错的话,如果你传入的是 MySQL 的 Unicode,数据库会自动把它转换成 UTF-8 格式...

你也可以试试,

cell = unicode(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "")

或者直接使用一个第三方库。有一个不错的库可以帮你修复文本。

撰写回答