【问题标题】:How to hide one specific cell (input or output) in IPython Notebook?如何在 IPython Notebook 中隐藏一个特定的单元格(输入或输出)?
【发布时间】:2015-10-09 14:48:17
【问题描述】:

有没有办法在 IPython 笔记本中选择性地隐藏一个特定的输入或输出单元格?

我只能找到以下代码来显示/隐藏所有输入单元格。

http://blog.nextgenetics.net/?e=102

但是如果我只想隐藏笔记本的第一个输入单元格怎么办?

【问题讨论】:

  • 好像没有什么简单的办法?我认为这很有用,因为有时您确实想隐藏一些太长或与上下文无关的单元格。
  • 2018 年为人们解答。您可以切换到 Jupyter 实验室。有一个悬停工具显示在单元格的左侧(代码和输出),单击哪个折叠该单元格
  • 这个 sn-p 添加了一个按钮来隐藏具有“可隐藏”标签的单元格(需要 nbconvert 5.6.1):gitlab.tetras-libre.fr/tetras-libre/jupyter/nbviewer/snippets/6
  • 你好。很久以来我一直在寻找这个查询。这里没有一个答案适用于将单元格隐藏在笔记本中,尤其是当我们加载 .ipynb 文件时。你知道怎么做吗?还是您的查询与我的不同?
  • 对我来说,有数百个单元格。其中,有一些要显示代码,而另一些则不显示代码。我需要在打开 ipynb 文件时隐藏“不显示”单元格。或者在打开一个单元格后运行它。同样,我不希望观众看到我跑了一个单元格来隐藏其他人,所以这个页面上的答案再次不起作用。有什么办法吗?

标签: ipython ipython-notebook


【解决方案1】:

现在使用标签将其内置到 nbconvert (as of 5.3.0) 中。

这是一个从输出中删除特定单元格的示例。使用this notebook。该示例包含三个单元格:一个 markdown 单元格、一个将被隐藏的代码单元格和一个不会被隐藏的代码单元格。

  1. 使用笔记本或 JupyterLab 中内置的标签编辑器将 remove_cell 标签添加到要隐藏的任何单元格(具体名称“remove_cell”无关紧要)
  2. 使用 nbconvert 转换

    jupyter nbconvert nbconvert-example.ipynb --TagRemovePreprocessor.remove_cell_tags='{"remove_cell"}'

任何带有标签remove_cell 的单元格都将从输出中删除。

除了整个单元格之外,您还可以只过滤输入或只过滤输出:

  • TagRemovePreprocessor.remove_input_tags
  • TagRemovePreprocessor.remove_single_output_tags
  • TagRemovePreprocessor.remove_all_outputs_tags

【讨论】:

  • 谢谢。但是,它仅适用于 html 输出吗?如果使用 jupyter nbconvert --to notebook --inplace ...,生成的 .ipynb 文件中似乎没有隐藏任何内容。
  • 我不得不在 Windows 上交换引号;例如:jupyter nbconvert nbconvert-example.ipynb --TagRemovePreprocessor.remove_cell_tags="{'a', 'b'}".
  • 我必须将花括号更改为方括号 (list) 才能使其正常工作,即 --TagRemovePreprocessor.remove_cell_tags='["remove_cell"]'
  • 请注意,在 jupyter lab 中,为了添加标签,您需要将以下内容添加到单元元数据中:tags: ["remove_cell"]
  • 打开 ipynb 文件时有什么方法可以隐藏单元格?我需要将它们隐藏在笔记本本身中,并且不打算将笔记本转换为单独的 pdf 或 html 文件。
【解决方案2】:

这是 Mathmagician 答案的扩展,可让您:

  • toggle just a single cell(JS函数名有随机后缀,所以如果多次使用,不会与其他用法冲突)李>
  • 切换下面当前单元格的单元格 - 这在 RISE 演示文稿中非常方便,您可能希望在其中显示代码,然后将其隐藏以显示其输出

你需要做的是首先运行以下代码来定义hide_toggle函数:

from IPython.display import HTML
import random

def hide_toggle(for_next=False):
    this_cell = """$('div.cell.code_cell.rendered.selected')"""
    next_cell = this_cell + '.next()'

    toggle_text = 'Toggle show/hide'  # text shown on toggle link
    target_cell = this_cell  # target cell to control with toggle
    js_hide_current = ''  # bit of JS to permanently hide code in current cell (only when toggling next cell)

    if for_next:
        target_cell = next_cell
        toggle_text += ' next cell'
        js_hide_current = this_cell + '.find("div.input").hide();'

    js_f_name = 'code_toggle_{}'.format(str(random.randint(1,2**64)))

    html = """
        <script>
            function {f_name}() {{
                {cell_selector}.find('div.input').toggle();
            }}

            {js_hide_current}
        </script>

        <a href="javascript:{f_name}()">{toggle_text}</a>
    """.format(
        f_name=js_f_name,
        cell_selector=target_cell,
        js_hide_current=js_hide_current, 
        toggle_text=toggle_text
    )

    return HTML(html)

然后在这样的单元格中使用它:

x = 1
y = 2
print('Result is {} + {}'.format(x, y))

hide_toggle()

或者这个(如果你想切换下一个单元格)

hide_toggle(for_next=True)

【讨论】:

  • 上述代码的最小python版本似乎是3.6。对于将两个 f 字符串 f' ....' 转换为旧样式的任何人,将在 3.6 以下工作
  • 对了,谢谢,我现在改成向后兼容的字符串格式化方式
  • @Ferrard,感谢您提供 RISE 演示文稿参考 - 不知道这样的选项。
  • 这太棒了!谢谢
  • 请注意,这只适用于 Jupyter Notebook。这不适用于 Jupyter Lab 或导出为 html。
【解决方案3】:

这是一种允许您通过仅编辑单元格元数据来隐藏 HTML/PDF 输出中的单元格的方法。

我正在使用的版本:

$ jupyter notebook --version

4.1.0

$ jupyter nbconvert --version

4.2.0

  1. 按照 Github 上的安装说明下载 ipython 笔记本扩展模板:pip install https://github.com/ipython-contrib/IPython-notebook-extensions/tarball/master
  2. 运行jupyter notebook
  3. 转到localhost:8888/nbextensions(或您启动的任何端口)并激活Printview
  4. 返回localhost:8888/tree,创建一个新笔记本并进入它
  5. 创建一个代码单元,其中包含一些生成输出的代码,例如print("You can see me") #but not me
  6. 转到View > Cell Toolbar > Edit Metadata
  7. 点击现在显示在单元格右上角的Edit Metadata 按钮
  8. 'hide_input':True 添加到 json 例如我的看起来像 { "collapsed": false, "hide_input": true, "trusted": true } 之后
  9. 保存笔记本
  10. 回到终端执行jupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb(如果你的笔记本叫notebookname.ipynb.ipynb

您现在应该在目录中有一个名为 notebookname.pdf 的文档。希望它应该只有文本You can see me ......手指交叉。

【讨论】:

  • 好细节。糟糕的过程:太重量级了。我们不能在单元格本身中添加注释吗?这个过程很笨拙
【解决方案4】:

您隐藏所有输入单元格的解决方案可以更改为仅影响单个单元格。

'div.input' 更改为'div.cell.code_cell.rendered.selected div.input'

HTML('''<script>
code_show=true; 
function code_toggle() {
    if (code_show){
        $('div.cell.code_cell.rendered.selected div.input').hide();
    } else {
        $('div.cell.code_cell.rendered.selected div.input').show();
    }
    code_show = !code_show
} 

$( document ).ready(code_toggle);
</script>

To show/hide this cell's raw code input, click <a href="javascript:code_toggle()">here</a>.''')

这是因为当您单击单元格输出上的“单击此处”提示时,该单元格将成为“选定”单元格并因此被隐藏。

如果您的 JavaScript 代码在 &lt;script&gt;&lt;/script&gt; 标记内使用类似这样的代码行执行切换

$( document ).ready(code_toggle);

然后在执行输入单元格时,该块将自动(“默认”)隐藏。

请记住,如果您默认隐藏单元格输入,则必须使用 Run Cells (Ctrl+Return) 选项,不是 运行单元格和选择/插入下方 选项。 这些将提示在执行 JavaScript 之前将“选定”标签移动到下一个单元格,因此您最终可能会隐藏一个在其输出中没有“单击此处”切换链接的单元格.在这种情况下,您必须检查单元格并浏览相关标签并将display='none'; 更改为display='block';

请注意,这必须放在单元格中任何代码的末尾,并且在执行此代码之前,您需要从 IPython.display 导入 HTML。你可以通过执行来做到这一点

from IPython.display import HTML

【讨论】:

  • 我正在使用这个解决方案。我把它隐藏了,但是当我导出为 html 时,代码就会显示出来。如何在不显示特定单元格的情况下导出笔记本?
【解决方案5】:

好的,在尝试没有成功之后,这里的答案说明了。我发现了 kirbs.Hide_code nbextension 的这个扩展,它工作得很好。但建议做到以下几点:

首先,确保您已更新您的 jupyter、nbconverter、nbconverter 扩展和 jupyter 服务器扩展。如果你这样做了,那么你可以在 anaconda 提示符中执行以下操作(以管理员权限打开):

  1. pip install hide_code
  2. jupyter nbextension install --py hide_code
  3. jupyter nbextension enable --py hide_code
  4. jupyter serverextension enable --py hide_code

最后,如果您使用 anaconda 发行版打开笔记本,请确保也使用以下命令:

  1. jupyter nbextension install --sys-prefix --py hide_code
  2. jupyter nbextension enable --sys-prefix --py hide_code
  3. jupyter serverextension enable --sys-prefix --py hide_code

如果执行这些命令没有错误,那么您将能够看到并使用工具栏中的隐藏代码选项,如下所示:

Hide_code toolbar

完成!如果您使用按钮进行导出和瞧!

Export Button

祝你好运

【讨论】:

    【解决方案6】:

    关于输出,在 Jupiter notebook 中,栏上还有一个选项: 您可以Clear 输出,也可以使用Toggle 隐藏它。在这两种情况下,您都不会删除在单元格内计算的任何变量。

    【讨论】:

      【解决方案7】:

      如果有人发现排除所有代码单元有帮助(这不是这里所要求的),您可以添加此标志 nbconvert --TemplateExporter.exclude_code_cell=True

      【讨论】:

      • 这也不包括图像。有什么方法可以保留绘制的图像?
      • @AbayBektursun 此选项exclude_code_cell 不应排除输出单元格中的任何图像。
      【解决方案8】:

      使用该代码:

      # @hidden
      from IPython.display import HTML
      HTML('''<script>
      code_show=true; 
      function code_toggle() {
       if (code_show){
       $('.cm-comment:contains(@hidden)').closest('div.input').hide();
       } else {
       $('.cm-comment:contains(@hidden)').closest('div.input').show();
       }
       code_show = !code_show
      } 
      $( document ).ready(code_toggle);
      </script>
      The raw code for this IPython notebook is by default hidden for easier reading.
      To toggle on/off the raw code, click <a href="javascript:code_toggle()">here</a>.''')
      

      here中提取并由我修改。

      您可以隐藏带有注释的行:

      # @hidden
      

      【讨论】:

        【解决方案9】:
        【解决方案10】:

        @Mathmagician 解决方案几乎是完美的,但有很多副作用。

        更正确的是:

        from IPython.core.display import display, HTML
        toggle_code_str = '''
        <form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Toggle Code"></form>
        '''
        
        toggle_code_prepare_str = '''
            <script>
            function code_toggle() {
                if ($('div.cell.code_cell.rendered.selected div.input').css('display')!='none'){
                    $('div.cell.code_cell.rendered.selected div.input').hide();
                } else {
                    $('div.cell.code_cell.rendered.selected div.input').show();
                }
            }
            </script>
        
        '''
        
        display(HTML(toggle_code_prepare_str + toggle_code_str))
        
        def toggle_code():
            display(HTML(toggle_code_str))
        

        toggle_code 的调用可能会在其他代码之前放置在某个代码单元格中,因此如果单元格中的代码执行缓慢,不会产生副作用。它还解决了 Run Cells 和 Select/Insert below

        的问题

        添加了切换按钮,但初始状态无法管理

        【讨论】:

        • 当我运行此代码以实际关闭代码时,如何制作默认视图?
        • 这在某种程度上有效。但是如果我们这样做并且意外或故意刷新(重新加载)笔记本窗口(或浏览器窗口),那么切换按钮将在下次刷新浏览器窗口而不是切换,除非我们再次运行每个切换函数调用。不过我不知道是什么原因造成的。
        【解决方案11】:

        删除导出为 HTML 的笔记本中的输入和输出

        当我想在导出为 HTML 的笔记本中隐藏输入时,我无法让上述任何解决方案发挥作用。我什至不需要切换来显示隐藏的元素。

        因此,我的解决方案是简单地将笔记本导出为 HTML,并使用 Chrome 的 Inspect 工具删除输入。

        您可以在那里删除单元格的输入/输出(或整个单元格)。编辑完成后,按 ctrl + s 保存编辑好的文件。

        更具体的code cell的输入输出有以下div,可以删除:
        &lt;div class="jp-Cell-inputWrapper"&gt;...&lt;/div&gt;
        &lt;div class="jp-Cell-outputWrapper"&gt;...&lt;/div&gt;

        它们在代码单元内:
        &lt;div class="jp-Cell jp-CodeCell jp-Notebook-cell "&gt;...&lt;/div&gt;'

        代码单元格位于&lt;body&gt; 标签内,因此在检查器中找到它不会太难。找到它的最简单方法是右键单击单元格中的空白点并选择 Inspector。然后你可以在 Inspector 窗口中找到上面提到的标签。在文本编辑器中编辑 HTML 很困难,因为文件可能有 20 000 行长。

        【讨论】:

          【解决方案12】:

          TomAugspurger 给出的答案对我有用。 Jupyter 实验室有一个“属性检查器”(右上角的齿轮图标)。在“单元格标签”部分是添加标签的简单方法。 “to_remove”已经设置好,只需点击一下即可成功。

          我正在创建一个 PDF 文档并且不想要任何输入或“to_remove”输出。 我的最后一个命令行是

          jupyter nbconvert "nbconvert_example.ipynb" --to pdf --no-input --TagRemovePreprocessor.remove_cell_tags='to_remove'

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-27
            • 1970-01-01
            • 2016-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多