Jupyter Notebook nbconvert 没有魔法命令/ w/o markdown
Jupyter Notebook nbconvert without magic commands/ w/o markdown
我有一个 Jupyter
笔记本,我想使用 在 中的 nbconvert
命令将其转换为 Python
脚本Jupyter
笔记本。
我在笔记本末尾添加了以下行:
!jupyter nbconvert --to script <filename>.ipynb
这将创建一个 Python
脚本。但是,我希望生成的 .py
文件具有以下属性:
- 没有输入语句,如:
# In[27]:
- 无降价,包括如下语句:
# coding: utf-8
忽略%magic
命令,例如:
%matplotlib inline
!jupyter nbconvert --to script <filename>.ipynb
,即笔记本中执行Python
转换 的命令
目前,%magic
命令被翻译成以下形式:get_ipython().magic(...)
,但这些在 Python
.
中不一定被识别
控制输出中显示的内容的一种方法是标记输出中不需要的单元格,然后使用 TagRemovePreprocessor 删除单元格。
下面的代码还使用了 TemplateExporter 中的 exclude_markdown 函数来删除 markdown。
!jupyter nbconvert \
--TagRemovePreprocessor.enabled=True \
--TagRemovePreprocessor.remove_cell_tags="['parameters']" \
--TemplateExporter.exclude_markdown=True \
--to python "notebook_with_parameters_removed.ipynb"
要删除注释行和输入语句市场(如 # [1]),我相信您需要 post-使用类似于以下内容的内容处理 Python 文件您调用 !jupyter nbconvert 的单元格之后的单元格(请注意,这是 Python 3 代码):
import re
from pathlib import Path
filename = Path.cwd() / 'notebook_with_parameters_removed.py'
code_text = filename.read_text().split('\n')
lines = [line for line in code_text if len(line) == 0 or
(line[0] != '#' and 'get_ipython()' not in line)]
clean_code = '\n'.join(lines)
clean_code = re.sub(r'\n{2,}', '\n\n', clean_code)
filename.write_text(clean_code.strip())
Jupyter nbconvert 使用新的 template structure.
让这件事变得更容易一些
模板应放在模板路径中。这个可以通过运行jupyter --paths
找到
每个模板都应放在模板目录中自己的目录中,并且必须包含 conf.json 和 index.py.j2 文件。
此 涵盖了添加模板的所有详细信息。
此模板将删除所有降价、魔术和单元格数字,留下“可运行”的 .py 文件。 运行 此模板来自笔记本 !jupyter nbconvert --to python --template my_clean_python_template my_notebook.ipynb
index.py.j2
{%- extends 'null.j2' -%}
## set to python3
{%- block header -%}
#!/usr/bin/env python3
# coding: utf-8
{% endblock header %}
## remove cell counts entirely
{% block in_prompt %}
{% if resources.global_content_filter.include_input_prompt -%}
{% endif %}
{% endblock in_prompt %}
## remove markdown cells entirely
{% block markdowncell %}
{% endblock markdowncell %}
{% block input %}
{{ cell.source | ipython2python }}
{% endblock input %}
## remove magic statement completely
{% block codecell %}
{{'' if "get_ipython" in super() else super() }}
{% endblock codecell%}
最明显的解决方案似乎对我有用:
jupyter nbconvert --to python a_notebook.ipynb --stdout | grep -v -e "^get_ipython" | python
当然,您不能在笔记本中使用类似 dirs = !ls
的东西来实现此功能。
我有一个 Jupyter
笔记本,我想使用 在 中的 nbconvert
命令将其转换为 Python
脚本Jupyter
笔记本。
我在笔记本末尾添加了以下行:
!jupyter nbconvert --to script <filename>.ipynb
这将创建一个 Python
脚本。但是,我希望生成的 .py
文件具有以下属性:
- 没有输入语句,如:
# In[27]:
- 无降价,包括如下语句:
# coding: utf-8
忽略
%magic
命令,例如:%matplotlib inline
!jupyter nbconvert --to script <filename>.ipynb
,即笔记本中执行Python
转换 的命令
目前,
%magic
命令被翻译成以下形式:get_ipython().magic(...)
,但这些在Python
. 中不一定被识别
控制输出中显示的内容的一种方法是标记输出中不需要的单元格,然后使用 TagRemovePreprocessor 删除单元格。
下面的代码还使用了 TemplateExporter 中的 exclude_markdown 函数来删除 markdown。
!jupyter nbconvert \
--TagRemovePreprocessor.enabled=True \
--TagRemovePreprocessor.remove_cell_tags="['parameters']" \
--TemplateExporter.exclude_markdown=True \
--to python "notebook_with_parameters_removed.ipynb"
要删除注释行和输入语句市场(如 # [1]),我相信您需要 post-使用类似于以下内容的内容处理 Python 文件您调用 !jupyter nbconvert 的单元格之后的单元格(请注意,这是 Python 3 代码):
import re
from pathlib import Path
filename = Path.cwd() / 'notebook_with_parameters_removed.py'
code_text = filename.read_text().split('\n')
lines = [line for line in code_text if len(line) == 0 or
(line[0] != '#' and 'get_ipython()' not in line)]
clean_code = '\n'.join(lines)
clean_code = re.sub(r'\n{2,}', '\n\n', clean_code)
filename.write_text(clean_code.strip())
Jupyter nbconvert 使用新的 template structure.
让这件事变得更容易一些模板应放在模板路径中。这个可以通过运行jupyter --paths
每个模板都应放在模板目录中自己的目录中,并且必须包含 conf.json 和 index.py.j2 文件。
此
此模板将删除所有降价、魔术和单元格数字,留下“可运行”的 .py 文件。 运行 此模板来自笔记本 !jupyter nbconvert --to python --template my_clean_python_template my_notebook.ipynb
index.py.j2
{%- extends 'null.j2' -%}
## set to python3
{%- block header -%}
#!/usr/bin/env python3
# coding: utf-8
{% endblock header %}
## remove cell counts entirely
{% block in_prompt %}
{% if resources.global_content_filter.include_input_prompt -%}
{% endif %}
{% endblock in_prompt %}
## remove markdown cells entirely
{% block markdowncell %}
{% endblock markdowncell %}
{% block input %}
{{ cell.source | ipython2python }}
{% endblock input %}
## remove magic statement completely
{% block codecell %}
{{'' if "get_ipython" in super() else super() }}
{% endblock codecell%}
最明显的解决方案似乎对我有用:
jupyter nbconvert --to python a_notebook.ipynb --stdout | grep -v -e "^get_ipython" | python
当然,您不能在笔记本中使用类似 dirs = !ls
的东西来实现此功能。