如何移除Python Polars生成的HTML文本输出中的双引号?
解决Polars生成HTML时字符串列带双引号的问题
问题说明
在Flask应用中将DataFrame处理从Pandas迁移到Polars后,使用_repr_html_()生成的HTML输出中,Text列的字符串值被自动包裹双引号,但控制台执行print(df)时无引号。尝试调整Polars配置参数、修改数据字典、用CSS隐藏引号均无效,目前通过字符串替换临时解决,需要更优雅的方案。
原代码(存在两处关键误用):
import polars as pl import pandas as pd data = { 'Text': ['Virginia Woolf, Mrs. Dalloway', 'College website corpus', 'Presidential inaugural speeches', 'Federalist Papers', 'British Novels', 'YOUR TEXT'], 'To Be Frequency': [28.3, 16.7, 31.8, 39.8, 31.4, results[1]] } df = pd.from_dict(data) # 错误:此处应使用pl.from_dict生成Polars DataFrame # 错误:误用pd.Config,实际需修改Polars的配置,应使用pl.Config pd.Config.set_tbl_hide_column_data_types(True) pd.Config.set_tbl_hide_dataframe_shape(True) pd.Config.set_fmt_str_lengths(40) pd.Config.set_tbl_width_chars(200) textresult = df.sort('To Be Frequency')._repr_html_()
优雅解决方案
1. 先修正代码中的基础误用
- 将
pd.from_dict(data)改为pl.from_dict(data),确保生成的是Polars DataFrame,而非Pandas的。 - 将
pd.Config替换为pl.Config,否则所有Polars的渲染配置不会生效。
2. 用to_html()替代_repr_html_()并自定义格式化
_repr_html_()是Polars为交互式环境(如Jupyter)设计的默认渲染逻辑,会给字符串列添加引号;而to_html()提供了formatters参数,可自定义每列的输出方式,直接去掉字符串的引号:
import polars as pl data = { 'Text': ['Virginia Woolf, Mrs. Dalloway', 'College website corpus', 'Presidential inaugural speeches', 'Federalist Papers', 'British Novels', 'YOUR TEXT'], 'To Be Frequency': [28.3, 16.7, 31.8, 39.8, 31.4, results[1]] } df = pl.from_dict(data) # 配置Polars的HTML渲染参数 pl.Config.set_tbl_hide_column_data_types(True) pl.Config.set_tbl_hide_dataframe_shape(True) pl.Config.set_fmt_str_lengths(40) pl.Config.set_tbl_width_chars(200) # 自定义Text列的格式化:直接返回原字符串,不添加引号 def format_text(value): return value # 生成HTML时指定Text列的格式化函数 textresult = df.sort('To Be Frequency').to_html( formatters={'Text': format_text} )
3. 进阶:手动生成自定义HTML表格
如果需要完全控制HTML结构(比如适配Flask模板的CSS样式),可以手动遍历Polars DataFrame生成表格:
def polars_to_flask_table(df): # 构建表头 header = "<tr>" + "".join([f"<th>{col}</th>" for col in df.columns]) + "</tr>" # 构建表体行 body_rows = [] for row in df.iter_rows(named=True): row_cells = [] for col, val in row.items(): # Text列直接输出原始值,数值列保留格式 cell_val = val if col == "Text" else str(val) row_cells.append(f"<td>{cell_val}</td>") body_rows.append("<tr>" + "".join(row_cells) + "</tr>") # 拼接完整表格HTML,可添加自定义类名 return f"<table class='flask-table'>{header}{''.join(body_rows)}</table>" # 使用自定义函数生成适配Flask的HTML textresult = polars_to_flask_table(df.sort('To Be Frequency'))
内容的提问来源于stack exchange,提问作者SummittDweller
相关产品推荐
相关产品推荐

