Python知乎编辑器中快速生成表格
知乎编辑文本时,插入表格是个比较困难的事情,本文将解决这个问题。
思路:参考@品颜完月 的“知乎编辑文本:插入表格和表格内换行的方法” 一文,将Markdown代码转换为LaTeX代码。
本文将利用pandas 的to_markdown()方法(pandas 1.0版本以上才有)、字符串的replace()方法以及字符串拼接实现Markdown代码转换为LaTeX代码
下面这篇文章写了怎样快速利用Pandas生成Markdown 表格的方法。
https://zhuanlan.zhihu.com/p/114041168
这篇文章介绍了利用LaTeX写公式的方法添加表格。
https://zhuanlan.zhihu.com/p/75947052
先上效果
观察代码
Markdown 代码(由to_markdown()方法生成)
import pandas as pd
import numpy as np
data = pd.read_csv('iris.csv', header=0)
print(data.head().to_markdown())
代码输出为:
| | sepal_length | sepal_width | petal_length | petal_width | species |
| ---: | -----------: | ----------: | -----------: | ----------: | :------ |
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5 | 3.6 | 1.4 | 0.2 | setosa |
LaTeX代码
$$
\begin{array}[b] {|c|c|}
\hline & sepal\_length & sepal\_width & petal\_length & petal\_width & species \\
\hline---:&---------------:&--------------:&---------------:&--------------:&:----------\\
\hline 0 & 5.1 & 3.5 & 1.4 & 0.2 & setosa \\
\hline 1 & 4.9 & 3 & 1.4 & 0.2 & setosa \\
\hline 2 & 4.7 & 3.2 & 1.3 & 0.2 & setosa \\
\hline 3 & 4.6 & 3.1 & 1.5 & 0.2 & setosa \\
\hline 4 & 5 & 3.6 & 1.4 & 0.2 & setosa \\ \hline
\end{array}\\
$$
观察结果
- 数据主体不变;
- 首尾添加了字符串;
- 换行处比较特别,要特别处理;
- 每行数据之间用 & 隔开。
代码实现
首先获取markdown代码
mk = data.head().to_markdown()
看一下代码的数据类型。
type(mk)
out: str
字符串类型,我们可以使用字符串相关操作进行处理。
具体实现
- 处理换行部分
- 将每一行的尾部"|\n|",直接替换成"\\\n\hline"。
print(mk.replace('|\n|','\\\\\n\\hline'))
out:
| | sepal_length | sepal_width | petal_length | petal_width | species \\
\hline---:|---------------:|--------------:|---------------:|--------------:|:----------\\
\hline 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa \\
\hline 1 | 4.9 | 3 | 1.4 | 0.2 | setosa \\
\hline 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa \\
\hline 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa \\
\hline 4 | 5 | 3.6 | 1.4 | 0.2 | setosa |
可以看到已经很接近最终结果了。
- 替换数据之间的"|"
print(mk.replace('|\n|','\\\\\n\\hline').replace('|','&'))
out:
& & sepal_length & sepal_width & petal_length & petal_width & species \\
\hline---:&---------------:&--------------:&---------------:&--------------:&:----------\\
\hline 0 & 5.1 & 3.5 & 1.4 & 0.2 & setosa \\
\hline 1 & 4.9 & 3 & 1.4 & 0.2 & setosa \\
\hline 2 & 4.7 & 3.2 & 1.3 & 0.2 & setosa \\
\hline 3 & 4.6 & 3.1 & 1.5 & 0.2 & setosa \\
\hline 4 & 5 & 3.6 & 1.4 & 0.2 & setosa &
- 定义首尾字符串并进行拼接
header = '$$\n\\begin{array}[b] {|c|c|}\n\\hline'
ender = '\\\\ \\hline\n\end{array}\\\\\n$$'
# 注意:要将字符串中的"_" 替换为"\_",否则下划线后面的字符会显示为下标。
print(header + mk.replace('|\n|','\\\\\n\\hline').replace('|','&').replace('_','\\_')[1:-1] + ender)
out:
$$
\begin{array}[b] {|c|c|}
\hline & sepal\_length & sepal\_width & petal\_length & petal\_width & species \\
\hline---:&---------------:&--------------:&---------------:&--------------:&:----------\\
\hline 0 & 5.1 & 3.5 & 1.4 & 0.2 & setosa \\
\hline 1 & 4.9 & 3 & 1.4 & 0.2 & setosa \\
\hline 2 & 4.7 & 3.2 & 1.3 & 0.2 & setosa \\
\hline 3 & 4.6 & 3.1 & 1.5 & 0.2 & setosa \\
\hline 4 & 5 & 3.6 & 1.4 & 0.2 & setosa \\ \hline
\end{array}\\
$$
- 函数封装
def markdown_to_latex(mkstr):
header = '$$\n\\begin{array}[b] {|c|c|}\n\\hline'
ender = '\\\\ \\hline\n\end{array}\\\\\n$$'
latex = header + mkstr.replace('|\n|','\\\\\n\\hline') \
.replace('|','&') \
.replace('_','\\_')[1:-1] + ender
print(latex)
举个栗子试一下。
markdown_to_latex(tips.head().to_markdown())
out:
$$
\begin{array}[b] {|c|c|}
\hline & total\_bill & tip & sex & smoker & day & time & size \\
\hline---:&-------------:&------:&:-------&:---------&:------&:-------&-------:\\
\hline 0 & 16.99 & 1.01 & Female & No & Sun & Dinner & 2 \\
\hline 1 & 10.34 & 1.66 & Male & No & Sun & Dinner & 3 \\
\hline 2 & 21.01 & 3.5 & Male & No & Sun & Dinner & 3 \\
\hline 3 & 23.68 & 3.31 & Male & No & Sun & Dinner & 2 \\
\hline 4 & 24.59 & 3.61 & Female & No & Sun & Dinner & 4 \\ \hline
\end{array}\\
$$
最后直接将代码粘贴复制在公式编辑框里
![](https://img.haomeiwen.com/i13700304/3d5bdbed78d897d0.png)
Tips: 如果你是在知乎编辑器里编辑文档,粘贴复制的时候把首尾的"$$"去掉。我用的是VSCode + Zhihu On VScode 插件编辑,所以直接粘贴复制。
网友评论