Python - Markdown Table - 仅在 Streamlit 中显示第一行

Python - Markdown Table - Only showing first row in Streamlit

如果需要,我可以尝试生成一个可重现的示例,但我想我会先展示代码。我正在使用 Streamlit 和一个函数,该函数接受一个 JSON 文件并在降价中从中生成一个 table:

      table = f"""
      |Rank|Title|Value|{"# words|" * n_words}{"Similarity|" * distance}
      |--|--|--|--|--|
      """
        for i, el in enumerate(data):
            line = f"""|{i + 1}|**{el["title"]}**|£{el["value"]:,}|"""
            if n_words:
                line += f"""{str(el["n_words"])}|"""
            if distance:
                line += f"""{str(round(el["distance"], 2))}"""
            line = f"""{line}
                """
            table += line
    
        st.markdown(table)

出于某种原因,它适用于第一行,但不适用于任何其他行。我做错了什么吗?

非常感谢!

你有两个问题。

  1. markdown 的调用需要减少缩进,以便在 for 循环结束后调用它,而不是在第一个循环结束时调用。
  2. 您需要从字符串文字中删除缩进。

具体来说,这一行...

line = f"""{line}
                """

... 导致第一行之后的每一行缩进 16 个空格。当然,Markdown 将缩进视为缩进文本是代码块的指示。

简单的解决方法是将该行替换为:

line = f"{line}\n"

如果您真的想要字符串文字,那么您可能要考虑使用 textwrap.dedent 函数。

不过,我会制作 table 一个列表,然后附加每一行。在附加所有行之后,然后是 join 行。事实上,您也可以对所有单元格执行相同的操作。像这样:

table = [
    f"|Rank|Title|Value|{"# words|" * n_words}{"Similarity|" * distance}",
    "|--|--|--|--|--|"
]
for i, el in enumerate(data):
    line = [f"{i + 1}", f'**{el["title"]}**', f'£{el["value"]:,}']
    if n_words:
        line.append(f'{str(el["n_words"])}')
    if distance:
        line.append(f'{str(round(el["distance"], 2))}')
    table.append(f'|{"|".join(line)}|')
st.markdown("\n".join(table))