如何在 IPython Notebook 中隐藏一个特定的单元格(输入或输出)?
How to hide one specific cell (input or output) in IPython Notebook?
有没有办法在 IPython 笔记本中有选择地隐藏一个特定的输入或输出单元格?
我只能找到下面的代码来显示/隐藏所有输入单元格。
http://blog.nextgenetics.net/?e=102
但是如果我只想隐藏笔记本的第一个输入单元格怎么办?
终于发现可以使用此扩展程序了。
https://github.com/ipython-contrib/IPython-notebook-extensions/blob/master/usability/hide_input.js
这是一种方法,可让您通过仅编辑单元格元数据来隐藏 HTML/PDF 输出中的单元格。
我使用的版本:
$ jupyter notebook --version
4.1.0
$ jupyter nbconvert --version
4.2.0
- 按照 Github 上的安装说明下载 ipython 笔记本扩展模板:pip install https://github.com/ipython-contrib/IPython-notebook-extensions/tarball/master
- 这只是将文件安装到本地 jupyter 数据目录中。 Full details in the readme
- 运行
jupyter notebook
- 转到
localhost:8888/nbextensions
(或您启动的任何端口)并激活Printview
- 返回
localhost:8888/tree
,创建一个新笔记本并进入
- 创建一个代码单元,其中包含生成输出的一些代码,例如
print("You can see me") #but not me
- 前往
View
> Cell Toolbar
> Edit Metadata
- 单击现在显示在单元格右上角的
Edit Metadata
按钮
- 将
'hide_input':True
添加到 json 例如在 之后我的看起来像 {
"collapsed": false,
"hide_input": true,
"trusted": true
}
- 保存笔记本
- 回到终端执行
jupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb
(如果你的notebook叫notebookname.ipynb.ipynb
)
您现在应该在目录中有一个名为 notebookname.pdf 的文档。希望它应该只有文本 You can see me
......祈祷吧。
可以更改隐藏所有输入单元格的解决方案以仅影响单个单元格。
将 '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>.''')
这是有效的,因为当您单击单元格输出上的“单击此处”提示时,该单元格将变为 "selected" 单元格,从而被隐藏。
如果您的 JavaScript 代码使用如下代码行在 <script></script>
标记内执行切换
$( document ).ready(code_toggle);
那么当执行输入单元格时,该块将自动("by default")隐藏。
请记住,如果您确实让单元格输入默认隐藏,您必须 运行 具有 运行 单元格 的单元格(Ctrl+Return)选项,不是运行单元格和 Select/Insert 低于 选项。
这些将提示在执行 JavaScript 之前将 "selected" 标签移动到下一个单元格,因此您最终可能会隐藏一个没有“单击此处" 在其输出中切换 link。在这种情况下,您将必须 检查 单元格并浏览相关标签并将 display='none';
更改为 display='block';
。
请注意,这必须放在单元格中任何代码的末尾,并且在执行此代码之前,您需要从 IPython.display 导入 HTML。您可以通过执行
from IPython.display import HTML
关于输出,在Jupiter notebook中,栏上也有一个选项:
您可以 Clear
输出或使用 Toggle
隐藏它。在这两种情况下,您都不会删除在单元格内计算的任何变量。
现在使用标签将其内置到 nbconvert (as of 5.3.0) 中。
这是一个从输出中删除特定单元格的示例。使用 this notebook。该示例具有三个单元格:一个降价单元格、一个将被隐藏的代码单元格和一个不会被隐藏的代码单元格。
- 使用笔记本或 JupyterLab 中内置的标签编辑器将
remove_cell
标签添加到您要隐藏的任何单元格(具体名称 "remove_cell" 无关紧要)
使用 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
如果有人发现排除所有代码单元有帮助(这不是这里要求的),您可以添加此标志 nbconvert --TemplateExporter.exclude_code_cell=True
@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
可能会在其他代码之前放置在某些代码单元中,因此如果单元中的代码执行缓慢,则不会产生副作用。它还解决了 运行 单元格和 Select/Insert Below
的问题
增加了切换按钮,但初始状态无法管理
这是 Mathmagician 答案的扩展,它使您能够:
- 只切换单个单元格(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)
好的,在尝试没有成功之后,这里给出了答案。我找到了 kirbs 的这个扩展。Hide_code nbextension 它工作得很好。但建议执行以下操作:
首先,请确保您已更新 jupyter、nbconverter、nbconverter 扩展和 jupyter serverextension。如果你这样做了,那么你可以在 anaconda 提示符下执行以下操作(以管理员权限打开):
pip install hide_code
jupyter nbextension install --py hide_code
jupyter nbextension enable --py hide_code
jupyter serverextension enable --py hide_code
最后,如果您使用 anaconda 发行版打开笔记本,请确保也使用这些命令:
jupyter nbextension install --sys-prefix --py hide_code
jupyter nbextension enable --sys-prefix --py hide_code
jupyter serverextension enable --sys-prefix --py hide_code
如果这些命令的执行没有错误,那么您将能够看到并使用工具栏中的隐藏代码选项,如下所示:
Hide_code toolbar
完成!如果您使用按钮进行导出,瞧!
Export Button
祝你好运
使用该代码:
# @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
删除导出到 HTML
的笔记本中的输入和输出
当我想隐藏导出到 HTML 的笔记本中的输入时,我无法使用上述任何解决方案。我什至不需要切换来显示隐藏的元素。
因此,我的解决方案是简单地将笔记本导出为 HTML 并使用 Chrome 的检查工具删除输入。
您可以在此处删除单元格的 input/output(或整个单元格)。编辑完成后,按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>
标签内,因此在检查器中不难找到。找到它的最简单方法是右键单击单元格中的空白点和 select 检查器。然后就可以在 Inspector window 中找到上面提到的标签了。在文本编辑器中编辑 HTML 很困难,因为文件可能有大约 20 000 行长。
TomAugspurger 给出的答案对我有用。 Jupyter 实验室有一个“属性 检查员”(右上角的齿轮图标)。在“单元格标签”部分是添加标签的简单方法。 “to_remove”已设置,只需点击一下即可成功。
我正在创建 PDF 文档,不需要任何输入或“to_remove”输出。
我的最终命令行是
jupyter nbconvert "nbconvert_example.ipynb" --to pdf --no-input --TagRemovePreprocessor.remove_cell_tags='to_remove'
有没有办法在 IPython 笔记本中有选择地隐藏一个特定的输入或输出单元格?
我只能找到下面的代码来显示/隐藏所有输入单元格。
http://blog.nextgenetics.net/?e=102
但是如果我只想隐藏笔记本的第一个输入单元格怎么办?
终于发现可以使用此扩展程序了。
https://github.com/ipython-contrib/IPython-notebook-extensions/blob/master/usability/hide_input.js
这是一种方法,可让您通过仅编辑单元格元数据来隐藏 HTML/PDF 输出中的单元格。
我使用的版本:
$ jupyter notebook --version
4.1.0
$ jupyter nbconvert --version
4.2.0
- 按照 Github 上的安装说明下载 ipython 笔记本扩展模板:pip install https://github.com/ipython-contrib/IPython-notebook-extensions/tarball/master
- 这只是将文件安装到本地 jupyter 数据目录中。 Full details in the readme
- 运行
jupyter notebook
- 转到
localhost:8888/nbextensions
(或您启动的任何端口)并激活Printview
- 返回
localhost:8888/tree
,创建一个新笔记本并进入 - 创建一个代码单元,其中包含生成输出的一些代码,例如
print("You can see me") #but not me
- 前往
View
>Cell Toolbar
>Edit Metadata
- 单击现在显示在单元格右上角的
Edit Metadata
按钮 - 将
'hide_input':True
添加到 json 例如在 之后我的看起来像 - 保存笔记本
- 回到终端执行
jupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb
(如果你的notebook叫notebookname.ipynb.ipynb
)
{
"collapsed": false,
"hide_input": true,
"trusted": true
}
您现在应该在目录中有一个名为 notebookname.pdf 的文档。希望它应该只有文本 You can see me
......祈祷吧。
可以更改隐藏所有输入单元格的解决方案以仅影响单个单元格。
将 '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>.''')
这是有效的,因为当您单击单元格输出上的“单击此处”提示时,该单元格将变为 "selected" 单元格,从而被隐藏。
如果您的 JavaScript 代码使用如下代码行在 <script></script>
标记内执行切换
$( document ).ready(code_toggle);
那么当执行输入单元格时,该块将自动("by default")隐藏。
请记住,如果您确实让单元格输入默认隐藏,您必须 运行 具有 运行 单元格 的单元格(Ctrl+Return)选项,不是运行单元格和 Select/Insert 低于 选项。
这些将提示在执行 JavaScript 之前将 "selected" 标签移动到下一个单元格,因此您最终可能会隐藏一个没有“单击此处" 在其输出中切换 link。在这种情况下,您将必须 检查 单元格并浏览相关标签并将 display='none';
更改为 display='block';
。
请注意,这必须放在单元格中任何代码的末尾,并且在执行此代码之前,您需要从 IPython.display 导入 HTML。您可以通过执行
from IPython.display import HTML
关于输出,在Jupiter notebook中,栏上也有一个选项:
Clear
输出或使用 Toggle
隐藏它。在这两种情况下,您都不会删除在单元格内计算的任何变量。
现在使用标签将其内置到 nbconvert (as of 5.3.0) 中。
这是一个从输出中删除特定单元格的示例。使用 this notebook。该示例具有三个单元格:一个降价单元格、一个将被隐藏的代码单元格和一个不会被隐藏的代码单元格。
- 使用笔记本或 JupyterLab 中内置的标签编辑器将
remove_cell
标签添加到您要隐藏的任何单元格(具体名称 "remove_cell" 无关紧要) 使用 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
如果有人发现排除所有代码单元有帮助(这不是这里要求的),您可以添加此标志 nbconvert --TemplateExporter.exclude_code_cell=True
@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
可能会在其他代码之前放置在某些代码单元中,因此如果单元中的代码执行缓慢,则不会产生副作用。它还解决了 运行 单元格和 Select/Insert Below
增加了切换按钮,但初始状态无法管理
这是 Mathmagician 答案的扩展,它使您能够:
- 只切换单个单元格(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)
好的,在尝试没有成功之后,这里给出了答案。我找到了 kirbs 的这个扩展。Hide_code nbextension 它工作得很好。但建议执行以下操作:
首先,请确保您已更新 jupyter、nbconverter、nbconverter 扩展和 jupyter serverextension。如果你这样做了,那么你可以在 anaconda 提示符下执行以下操作(以管理员权限打开):
pip install hide_code
jupyter nbextension install --py hide_code
jupyter nbextension enable --py hide_code
jupyter serverextension enable --py hide_code
最后,如果您使用 anaconda 发行版打开笔记本,请确保也使用这些命令:
jupyter nbextension install --sys-prefix --py hide_code
jupyter nbextension enable --sys-prefix --py hide_code
jupyter serverextension enable --sys-prefix --py hide_code
如果这些命令的执行没有错误,那么您将能够看到并使用工具栏中的隐藏代码选项,如下所示:
Hide_code toolbar
完成!如果您使用按钮进行导出,瞧!
Export Button
祝你好运
使用该代码:
# @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
删除导出到 HTML
的笔记本中的输入和输出当我想隐藏导出到 HTML 的笔记本中的输入时,我无法使用上述任何解决方案。我什至不需要切换来显示隐藏的元素。
因此,我的解决方案是简单地将笔记本导出为 HTML 并使用 Chrome 的检查工具删除输入。
您可以在此处删除单元格的 input/output(或整个单元格)。编辑完成后,按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>
标签内,因此在检查器中不难找到。找到它的最简单方法是右键单击单元格中的空白点和 select 检查器。然后就可以在 Inspector window 中找到上面提到的标签了。在文本编辑器中编辑 HTML 很困难,因为文件可能有大约 20 000 行长。
TomAugspurger 给出的答案对我有用。 Jupyter 实验室有一个“属性 检查员”(右上角的齿轮图标)。在“单元格标签”部分是添加标签的简单方法。 “to_remove”已设置,只需点击一下即可成功。
我正在创建 PDF 文档,不需要任何输入或“to_remove”输出。 我的最终命令行是
jupyter nbconvert "nbconvert_example.ipynb" --to pdf --no-input --TagRemovePreprocessor.remove_cell_tags='to_remove'