pandas.read_sql时出现UnicodeDecodeError错误

11
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 8: character maps to <undefined>

我在这个简单的SQL查询中看到了上述错误:

df = pd.read_sql(query,connection)

我在SQL开发人员上正常尝试了查询,并且运行得非常好。但是,在read_sql调用中如何指定编码方式让我感到困惑。

我使用的是Python 3.4和pandas版本0.14.1。


5
当您使用connect()连接到数据库时,传递charset='utf8'参数。 - Hisham Karam
1
数据库中的数据采用什么编码? - BrenBarn
1
获取编码方式 SELECT * FROM NLS_DATABASE_PARAMETERS - Hisham Karam
1
现在尝试使用 charset='iso-8859-1' - Hisham Karam
1
愉快的日子!成功了!!非常感谢您... 顺便说一下,当我在等待时,我也尝试了“latin-1”,它也起作用了... 我应该加入一些错误处理,以便今后尝试这三个? - spiff
显示剩余9条评论
2个回答

12

根据Oracle 文档,您的数据库应使用iso-8859-1编码。

因此,在连接到数据库时,请传递charset='iso-8859-1'encoding='iso-8859-1'参数。建议两种方式都尝试一下。


1
@HishamKaram 我也遇到了同样的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 1: invalid continuation byte。但是,不幸的是,你提供的解决方案都没有帮助到我。 - Ladenkov Vladislav
请通过执行此行“SELECT * FROM NLS_DATABASE_PARAMETERS”来告知您的数据库编码 @LadenkovVladislav - Hisham Karam
谢谢,但现在没事了。我刚刚发现,只是我有一些损坏的非UTF-8值。 - Ladenkov Vladislav
@hisham 你好,Hisham,你如何找到来自Oracle NLS_NCHAR_CHARACTERSET的编码映射? - siddhesh tiwari
4
当我执行conn = sqlite3.connect(sql_path,charset='iso-8859-1')时,我会得到TypeError: 'charset' is an invalid keyword argument for this function的错误提示……同样的问题也出现在encoding上! - Arcyno
我遇到了同样的问题,我的Oracle数据库中也使用了相同的字符集,但是当我使用cx_Oracle.connect('user', 'pass', dsn_tns, charset='iso-8859-1')时,它不起作用,并显示相同的错误。您能否验证我是否正确传递了参数?我还尝试了encoding='iso-8859-1',但没有成功。@HishamKaram - mostafa.S

2

Python3.7:

con = sqlite3.connect(path_to_db)
encoding = "latin1"
con.text_factory = lambda x: str(x, encoding)
# do not preserve non-printable
# con.text_factory = lambda x: str(x, "ascii", errors="ignore")
data = pd.read_sql_query(QUERY, con)

文本工厂的Pydocs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接