如何隐藏IPython Notebook中的一个特定单元格(输入或输出)?

时间:2015-07-20 12:58:26

标签: ipython ipython-notebook

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

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

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

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

12 个答案:

答案 0 :(得分:25)

现在使用标签将其内置到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"}'

  3. 任何标记为remove_cell的单元格都将从输出中删除。

    hidden

    除了整个单元格,您只需过滤输入或仅输出:

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

答案 1 :(得分:11)

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

我正在使用的版本:

$ jupyter notebook --version

4.1.0

$ jupyter nbconvert --version

4.2.0

  1. 按照Github上的安装说明下载ipython notebook扩展模板: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,例如
  9. 后,我看起来像{ "collapsed": false, "hide_input": true, "trusted": true }
  10. 保存笔记本
  11. 返回终端并执行jupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb(如果您的笔记本被称为notebookname.ipynb.ipynb
  12. 您现在应该在目录中有一个名为notebookname.pdf的文档。希望它应该只有文本You can see me ...手指交叉。

答案 2 :(得分:11)

这是Mathmagician答案的扩展,使您能够:

  • 仅切换一个单个单元格(JS函数名称具有一个随机后缀,因此,如果多次使用,它将与其他用法不会冲突
  • 切换当前单元格下方-在RISE演示文稿中超级方便,您可能想在其中显示代码,然后将其隐藏以显示其输出< / li>

demo of the toggle

您需要做的是先运行以下代码来定义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)

答案 3 :(得分:7)

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

'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代码使用一行代码在<script></script>代码中执行切换

$( document ).ready(code_toggle);

然后在执行输入单元格时隐藏块(“默认情况下”)。

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

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

来执行此操作
from IPython.display import HTML

答案 4 :(得分:5)

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

答案 5 :(得分:3)

如果有人发现排除所有有用的代码单元格(这不是此处提出的问题),您可以添加此标记nbconvert --TemplateExporter.exclude_code_cell=True

答案 6 :(得分:2)

好吧,尝试不成功后,这里给出了答案。我发现了kirbs的这种扩展。Hide_code nbextension很好用。但建议执行以下操作:

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

  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

祝你好运

答案 7 :(得分:1)

答案 8 :(得分:1)

@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可能会放在其他代码之前的某个代码单元中,因此,如果该单元中的代码执行缓慢,不会有副作用。还可以解决运行单元格并在下方选择/插入

的问题

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

答案 9 :(得分:1)

使用该代码:

# @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

答案 10 :(得分:0)

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

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

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

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

更具体地说,代码单元的输入和输出有以下div,您可以删除:
<div class="jp-Cell-inputWrapper">...</div>
<div class="jp-Cell-outputWrapper">...</div>

它们在代码单元内:
<div class="jp-Cell jp-CodeCell jp-Notebook-cell ">...</div>'

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

答案 11 :(得分:0)

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

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

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