当某些字符串具有UTF-8字符时为pandas DataFrame.style.render

时间:2018-11-18 07:22:23

标签: python pandas dataframe encoding

使用dataframe.style时,在Jupyter上正确显示重音符号:

df = pandas.DataFrame([['Madrid', 'León']], index=['Spain'], columns=['BigCity', 'SmallCity'])
df.style    
        BigCity SmallCity
Spain   Madrid  León

但是,如果我们使用style.render()方法获取HTML并将其写入文件,则带重音符号的编码不正确:

df.style.render()
'<style  type="text/css" >\n</style>  \n<table id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6" > \n<thead>    <tr> \n        <th class="blank level0" ></th> \n        <th class="col_heading level0 col0" >BigCity</th> \n        <th class="col_heading level0 col1" >SmallCity</th> \n    </tr></thead> \n<tbody>    <tr> \n        <th id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6level0_row0" class="row_heading level0 row0" >Spain</th> \n        <td id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6row0_col0" class="data row0 col0" >Madrid</td> \n        <td id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6row0_col1" class="data row0 col1" >León</td> \n    </tr></tbody> \n</table> '

当然那是行不通的。这是浏览器显示的内容:


enter image description here


如何纠正?

2 个答案:

答案 0 :(得分:1)

您在这里拥有的并不是确切的HTML或Pandas问题,而是一个字符集问题。参见https://www.w3schools.com/html/html_charset.asp

您的“拉丁小急性拉丁语”在UTF-8中为0xC3 0xB3。因此,第一个字节为195,第二个字节为179。在上面的链接中,195为“带波浪号的拉丁大写字母A”,而179为“上标3”。这就是为什么您看到ó。

因此Pandas正在生成正确的UTF-8 HTML,但是没有人告诉浏览器。您可以将HTML字符集显式设置为UTF-8,也可以将HTML版本显式设置为5(尽管可能存在特定于浏览器的怪癖,但应该默认将其设置为UTF-8)。

另一种解决此问题的方法可能是从Pandas中获取输出,并在写入文件之前调用calcDT进行转换。这将写成ó为243,它应该在不更改HTML标头的情况下工作。如果您的文档中包含非ISO-8859-1字符,则绝对不能正确工作,而将其保留为UTF-8格式将支持所有字符。

答案 1 :(得分:0)

我自己的问题的答案很简单,就像在render()方法的输出之前添加这样的标头一样:

outputHTML = '<meta charset="UTF-8">'+df.style.render()

首先,我仍然不明白为什么render()方法不能自动执行此操作。正如John指出的那样,在线上可能有很多文档,但是我无法找到解释。