Python 2.7 - Pandas UnicodeEncodeError с данными из pyodbc - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь извлечь данные из SQL Server с помощью pyodbc и загрузить их в информационный фрейм, а затем экспортировать их в файл 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(), и та же ошибка сохраняется.

1 Ответ

1 голос
/ 01 ноября 2019

Второй ответ на этот вопрос кажется приемлемым обходным путем, за исключением пользователей 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).

...