【问题标题】:UnicodeDecodeError with pandas.read_sqlpandas.read_sql 的 UnicodeDecodeError
【发布时间】:2017-03-07 00:04:08
【问题描述】:
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 版

【问题讨论】:

  • 当你connect() 到你的数据库时,传递charset='utf8' 参数。
  • 数据库中数据的编码是什么?
  • 获取编码SELECT * FROM NLS_DATABASE_PARAMETERS
  • 然后告诉我NLS_CHARACTERSET的值
  • 现在试试charset='iso-8859-1'

标签: python pandas unicode


【解决方案1】:

根据 oracle docs,您的数据库的正确编码是 iso-8859-1 所以当你 connect() 到你的数据库时,传递 charset='iso-8859-1'encoding='iso-8859-1' 尝试两者。

【讨论】:

  • @HishamKaram 我遇到了同样的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 1: invalid continuation byte。但是,不幸的是,您的解决方案都没有帮助我
  • 请通过执行此行SELECT * FROM NLS_DATABASE_PARAMETERS@LadenkovVladislav 告诉我您的数据库编码
  • @谢谢,但现在可以了。我刚刚发现,我只是有一些损坏的非 utf8 值
  • @hisham Hey Hisham 您如何从 Oracle NLS_NCHAR_CHARACTERSET 中找到编码映射?
  • 当我执行conn = sqlite3.connect(sql_path,charset='iso-8859-1') 时,我得到TypeError: 'charset' is an invalid keyword argument for this function....与encoding 相同!
【解决方案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 on text_factory

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 2019-04-15
    • 1970-01-01
    • 2019-05-16
    • 2021-04-14
    • 2018-04-05
    • 2021-10-13
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多