Python中pandas.to_html()默认使用gbk编码的问题如何解决?
从一个 html 文件已经读取表格数据进入到 pd
我准备把 pd 数据写入到一个 html 文件的时候,报了个错误,遇上了困扰了很多人编码类型的问题,
error in main!! 'gbk' codec can't decode byte 0x94 in position 256: illegal multibyte sequence
SomeFunc.py 里面的 transformCodec()是网上找的一个例子,好像不能正常工作,我理解是 2.x 版本写的,3.x 不合适?
import requests
import pandas as pd
import string
import time
import datetime
import codecs
import SomeFunc
srcfile = ‘C:/Users/Administrator/Desktop/src.html’
if name == ‘main’:
try:
f = codecs.open(srcfile, ‘r+’, ‘utf-8’)
readStr = f.read()
f.close()
PageDF = PageDF.append(pd.read_html(readStr)[7], ignore_index=True)
PageDF = PageDF.drop(PageDF.tail(1).index) #删除最后一行
#PageDF = SomeFunc.transformCodec(PageDF)
PageDF.to_html(‘C:/Users/Administrator/Desktop/pcResult/A.html’)
except Exception as e:
print(‘error in main!!’, e)
#############################
SomeFunc.py #
#############################
def transformCodec(re_data):
try:
re_data = re_data.decode(‘gbk’)
except Exception as error:
print(“error”)
print(‘delete illegal string,try again…’)
pos = re.findall(r'decodebytesinposition([\d]+)-([\d]+):illegal', str(error).replace(' ', ''))
if len(pos) == 1:
re_data = re_data[0:int(pos[0][0])] + re_data[int(pos[0][1]):]
re_data = transformCodec(re_data)
return re_data
return re_data
Python中pandas.to_html()默认使用gbk编码的问题如何解决?
遇到pandas.to_html()输出中文乱码,是因为它默认不指定编码,而你的环境或浏览器可能用GBK去解析。核心是确保输出的HTML文件头部声明和实际编码一致。
最直接的方法是在调用to_html()时,通过encoding参数指定为'utf-8',并确保生成的HTML字符串被正确写入文件。这里给你一个完整的例子:
import pandas as pd
# 创建一个包含中文的示例DataFrame
data = {'姓名': ['张三', '李四'], '城市': ['北京', '上海']}
df = pd.DataFrame(data)
# 关键步骤:生成HTML字符串,并指定编码为utf-8
html_string = df.to_html(index=False, encoding='utf-8')
# 注意:to_html(encoding='utf-8') 返回的是bytes,需要解码为str再写入,或者直接以二进制写入。
# 方法一:解码后以文本模式写入(明确指定encoding)
with open('output.html', 'w', encoding='utf-8') as f:
# 因为html_string是bytes,需要解码
f.write(html_string.decode('utf-8'))
# 方法二(更直接):直接以二进制模式写入bytes
with open('output_utf8.html', 'wb') as f:
f.write(html_string)
print("HTML文件已生成。请用支持UTF-8的文本编辑器或浏览器打开查看。")
要点说明:
df.to_html(encoding='utf-8')会返回字节串(bytes),而不是字符串。这是关键。- 写入文件时,必须与这个编码匹配。如果用文本模式写(
'w'),需要将bytes解码为str(如.decode('utf-8')),并给open()函数也指定encoding='utf-8'。更推荐直接用二进制模式('wb')写入bytes,避免任何隐式转换。 - 生成的HTML文件本身在
<head>部分会包含<meta charset="UTF-8">标签(pandas自动添加),告诉浏览器用UTF-8解析。
如果问题是因为已有代码接收字符串(str)而非bytes,或者环境限制,另一个思路是生成字符串,但手动确保编码信息:
# 生成字符串(不指定encoding参数,得到str)
html_str = df.to_html(index=False)
# 然后以UTF-8编码写入文件
with open('output_str.html', 'w', encoding='utf-8') as f:
f.write(html_str)
这种方式to_html()输出的字符串本身是Unicode,写入时由open函数处理编码。确保你的Python源文件本身也是UTF-8编码。
总结:用encoding='utf-8'参数并匹配正确的文件写入方式。

