2016-03-09 1 views
3

я получаю:Как экспортировать DataFrame в Html с помощью кодировки utf-8?

UnicodeEncodeError: 'ascii' codec can't encode characters in position 265-266: ordinal not in range(128) 

когда я пытаюсь:

df.to_html("mypage.html") 

вот пример того, как воспроизвести проблему:

df = pd.DataFrame({"a": [u'Rue du Gu\xc3\xa9, 78120 Sonchamp'], "b": [u"some other thing"]}) 
df.to_html("mypage.html") 

список элементов в "a" имеют тип "unicode".

, когда я хочу, чтобы экспортировать его в CSV-файл это работает, потому что вы можете сделать:

df.to_csv("myfile.csv", encoding="utf-8") 
+0

Это нормально работает на python 3, предположительно вы используете python 2? – EdChum

+0

@EdChum Я лично сталкивался с этим на Python2.7 много раз. –

+0

@EdChum python 2.7.6 – YOBA

ответ

2

Ваша проблема в другом коде. В вашем примере кода есть строка Unicode, которая была неправильно декодирована как latin1, Windows-1252 или аналогичная, так как в ней есть последовательности UTF-8. Здесь я отменить плохое декодирование и redecode как UTF-8, но вы хотите, чтобы найти, где неправильно декодирования выполняется:

>>> s = u'Rue du Gu\xc3\xa9, 78120 Sonchamp' 
>>> s.encode('latin1').decode('utf8') 
u'Rue du Gu\xe9, 78120 Sonchamp' 
>>> print(s.encode('latin1').decode('utf8')) 
Rue du Gué, 78120 Sonchamp 
+0

спасибо, но это не решает мою проблему, все еще получая ту же ошибку, хотя я применил ее ко всем элементам «a» в dataframe: df ["a"] = df.apply (lambda x: x [ «a»]. encode ('latin1'). decode ('utf8'), axis = 1) – YOBA

+0

@YOBA вы уверены, что строки должны быть Unicode? Ошибка, которую вы получаете, типична для использования '.decode' в уже декодированной строке Unicode в Python 2.x. –

0

Если вам действительно нужно сохранить вывод в HTML, вы можете попробовать очистку код в массиве numpy перед написанием to_html.

df = pd.DataFrame({"a": [u'Rue du Gu\xc3\xa9, 78120 Sonchamp'], "b": [u"some other thing"]}) 

def clean_unicode(df): 
    *#Transforms the DataFrame to Numpy array* 
    df=df.as_matrix() 
    *#Encode all strings with special characters* 
    for x in np.nditer(df, flags=['refs_ok'], op_flags =['copy', 'readonly']): 
     df[df==x]=str(str(x).encode("latin-1", "replace").decode('utf8')) 
    *#Transform the Numpy array to Dataframe again* 
    df=pd.DataFrame(df) 
    return df 

df=clean_unicode(df) 
df.to_html("Results.html') -----> Success! 
Смежные вопросы