美文网首页python自学
Python知乎编辑器中快速生成表格

Python知乎编辑器中快速生成表格

作者: Kaspar433 | 来源:发表于2020-03-18 22:04 被阅读0次

    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

    先上效果

    \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 代码(由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}\\
    $$
    

    观察结果

    1. 数据主体不变;
    2. 首尾添加了字符串;
    3. 换行处比较特别,要特别处理;
    4. 每行数据之间用 & 隔开。

    代码实现

    首先获取markdown代码

    mk = data.head().to_markdown()
    

    看一下代码的数据类型。

    type(mk)
    
    out: str
    

    字符串类型,我们可以使用字符串相关操作进行处理。

    具体实现

    1. 处理换行部分
      • 将每一行的尾部"|\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    |
    

    可以看到已经很接近最终结果了。

    1. 替换数据之间的"|"
    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    &
    
    1. 定义首尾字符串并进行拼接
    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}\\
    $$
    
    1. 函数封装
    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}\\
    $$
    

    最后直接将代码粘贴复制在公式编辑框里

    Image

    \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}\\

    Tips: 如果你是在知乎编辑器里编辑文档,粘贴复制的时候把首尾的"$$"去掉。我用的是VSCode + Zhihu On VScode 插件编辑,所以直接粘贴复制。

    相关文章

      网友评论

        本文标题:Python知乎编辑器中快速生成表格

        本文链接:https://www.haomeiwen.com/subject/dfrhyhtx.html