首页 > 解决方案 > Python 2.7 - 带有来自 pyodbc 的数据的 Pandas UnicodeEncodeError

问题描述

我正在尝试使用 pyodbc 从 SQL Server 中提取数据并将其加载到数据框中,然后将其导出到 HTML 文件中,但我一直收到以下 Unicode 错误:

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

这是我当前的设置(每个文档的编码说明):

cnxn =  pyodbc.connect('DSN=Planning;UID=USER;PWD=PASSWORD;')
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='cp1252', to=unicode)
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='cp1252', to=unicode)
cnxn.setdecoding(pyodbc.SQL_WMETADATA, encoding='cp1252', to=unicode)
cnxn.setencoding(str, encoding='utf-8')
cnxn.setencoding(unicode, encoding='utf-8')
cursor = cnxn.cursor()

with open('Initial Dataset.sql') as f:
    initial_query = f.read()

cursor.execute(initial_query)
columns = [column[0] for column in cursor.description]
initial_data = cursor.fetchall()
i_df = pd.DataFrame.from_records(initial_data, columns=columns)
i_df.to_html('initial.html')

需要注意的一个奇怪但有用的一点是,当我尝试导出 CSV 时:

i_df.to_csv('initial.csv')

我得到了同样的错误,但是当我添加时:

i_df.to_csv('initial.csv', encoding='utf-8')

有用。有人可以帮我理解这个编码问题吗?

旁注:我也尝试过使用sqlalchemy连接,pandas.read_sql()但同样的错误仍然存​​在。

标签: pythonpandaspyodbc

解决方案


这个问题的第二个答案似乎是一个可以接受的解决方法,除了 Python 2.x 用户,你必须使用io,所以:

import io

html = df.to_html()
with io.open("mypage.html", "w", encoding="utf-8") as file:
    file.write(html)

它未包含在最新版本中,但看起来下一个版本pandas将有一个encoding选项to_html(),请参阅文档(第 2228 行)。


推荐阅读