我正在考虑使用*。Ipynb文件作为真相的来源,并以编程方式将它们“编译”为.py文件,用于计划的作业/任务。
我所理解的做到这一点的唯一方法是通过GUI。有没有办法通过命令行来实现?
我正在考虑使用*。Ipynb文件作为真相的来源,并以编程方式将它们“编译”为.py文件,用于计划的作业/任务。
我所理解的做到这一点的唯一方法是通过GUI。有没有办法通过命令行来实现?
当前回答
遵循前面的例子,但是使用了新的nbformat lib版本:
import nbformat
from nbconvert import PythonExporter
def convertNotebook(notebookPath, modulePath):
with open(notebookPath) as fh:
nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)
exporter = PythonExporter()
source, meta = exporter.from_notebook_node(nb)
with open(modulePath, 'w+') as fh:
fh.writelines(source.encode('utf-8'))
其他回答
%notebook foo。ipynb magic命令将当前IPython导出到“foo.ipynb”。
更多信息输入%笔记本?
我已经构建了一个函数来实现这一点。用户不需要安装任何东西就可以使用它。
#!/usr/bin/python
# A short routine to convert a Jupyter Notebook to a Python file
import json
def ipynb_to_py(input_ipynb_file,output_py_file=None):
"""
Generate a Python script (.py) that includes all source code from the input Jupyter notebook (.ipynb).
The user can input a Jupyter Notebook file from the current working directory or from a path.
If the name for output Python file is not specified,
the output file name will copy the file name of the input Jupyter Notebook,
but the file exention will be changed from ".ipynb" chanegd to ".py".
And the output Python file will be saved at the same directory of the input Jupyter Notebook.
For example:
ipynb_to_py("test-jupyternotebook.ipynb")
ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb")
The user can also specify an output file name that ends with ".py".
If the output file name is provided, but no path to output file is added,
the file will be saved at the current working directory.
For example:
ipynb_to_py("test-jupyternotebook.ipynb","test1.py")
ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","test2.py")
The user can save out the file at a target directory by adding a path to the output file.
For example:
ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test3.py")
ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","./test-output-dir/test4.py")
This function does not edit or delete the original input Jupyter Notebook file.
Args:
-----
input_ipynb_file: The file name string for the Jupyter Notebook (ends with ".ipynb")
output_py_file (optional): The file name for Python file to be created (ends with ".py").
Returns:
--------
A Python file containing all source code in the Jupyter Notebook.
Example usages:
---------------
ipynb_to_py("test-jupyternotebook.ipynb")
ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb")
ipynb_to_py("test-jupyternotebook.ipynb","test1.py")
ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test2.py")
ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test3.py")
ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","./test-output-dir/test4.py")
"""
# Check if the input file is a Jupyter Notebook
if input_ipynb_file.endswith(".ipynb"):
# Open the input Jupyter Notebook file
notebook = open(input_ipynb_file)
# Read its content in the json format
notebook_content = json.load(notebook)
# Only extract the source code snippet from each cell in the input Jupyter Notebook
source_code_snippets = [cell['source'] for cell in notebook_content['cells']]
# If the name for output Python file is not specified,
# The name of input Jupyter Notebook will be used after changing ".ipynb" to ".py".
if output_py_file == None:
output_py_file = input_ipynb_file.split('.ipynb')[0]+".py"
else:
pass
# Create a Python script to save out all the extracted source code snippets
output_file = open(output_py_file,'w')
# Print out each line in each source code snippet to the output file
for snippet in source_code_snippets:
for line in snippet:
# Use end='' to avoid creating unwanted gaps between lines
print(line,end = '',file = output_file)
# At end of each snippet, move to the next line before printing the next one
print('',sep = '\n',file=output_file)
# Close the output file
output_file.close()
print("The path to output file:",output_py_file)
else:
print("The input file must be a Jupyter Notebook (in .ipynb format)!")
def main():
pass
if __name__ == "__main__":
main()
我遇到了这个问题,并试图在网上找到解决方案。虽然我找到了一些解决方案,但它们仍然存在一些问题,例如,当你从仪表板启动一个新笔记本时,烦人的Untitled.txt自动创建。
所以最终我写出了自己的解决方案:
import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path
def script_post_save(model, os_path, contents_manager, **kwargs):
"""Save a copy of notebook to the corresponding language source script.
For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
python script will also be saved in the same directory.
However, existing config files I found online (including the one written in
the official documentation), will also create an `Untitile.txt` file when
you create a new notebook, even if you have not pressed the "save" button.
This is annoying because we usually will rename the notebook with a more
meaningful name later, and now we have to rename the generated script file,
too!
Therefore we make a change here to filter out the newly created notebooks
by checking their names. For a notebook which has not been given a name,
i.e., its name is `Untitled.*`, the corresponding source script will not be
saved. Note that the behavior also applies even if you manually save an
"Untitled" notebook. The rationale is that we usually do not want to save
scripts with the useless "Untitled" names.
"""
# only process for notebooks
if model["type"] != "notebook":
return
script_exporter = ScriptExporter(parent=contents_manager)
base, __ = os.path.splitext(os_path)
# do nothing if the notebook name ends with `Untitled[0-9]*`
regex = re.compile(r"Untitled[0-9]*$")
if regex.search(base):
return
script, resources = script_exporter.from_filename(os_path)
script_fname = base + resources.get('output_extension', '.txt')
log = contents_manager.log
log.info("Saving script at /%s",
to_api_path(script_fname, contents_manager.root_dir))
with io.open(script_fname, "w", encoding="utf-8") as f:
f.write(script)
c.FileContentsManager.post_save_hook = script_post_save
要使用这个脚本,你可以将它添加到~/.jupyter/jupyter_notebook_config.py:)
请注意,您可能需要重新启动jupyter笔记本/实验室才能工作。
给出的解决方案仅适用于转换单个.py文件。下面是一个转换目录及其子目录中的所有.py文件的解决方案。
首先,您需要安装一次只转换一个文件的工具,如ipynb-py-convert
PIP安装ipynb-py-convert
然后cd到你的文件夹。py文件和目录的位置。然后我们在目录和子目录中的所有文件上递归地运行这个工具:
powershell:
foreach ($f在Get-ChildItem "."过滤器*。ipynb-py-convert $f。FullName " $(美元f.FullName.Substring (0, f.FullName.Length-6美元)). py”}
现在,如果你想用批处理转换从。ipynb转换到。py,你可以运行:
foreach ($f在Get-ChildItem "."-Filter *.py -递归){ipynb-py-convert $f。FullName " $(美元f.FullName.Substring (0, f.FullName.Length-3)美元).ipynb "}
这在我探索.py文件时给了我很大帮助。我做了一个项目的副本,运行这段代码,并快速在Jupiter测试代码的不同部分作为单元格等等。我希望它能帮助更多的人。
我知道这是一个老话题了。我也遇到过同样的问题,想通过命令行将.pynb文件转换为.py文件。
我的搜索把我带到了ipynb-py-convert
通过以下步骤,我能够得到.py文件
安装pip Install ipynb-py-convert 通过命令提示符进入ipynb文件所在目录 输入命令
ipynb-py-convert你的文件名。ipynb YourFilename.py
如:。ipynb-py-convert getting-started-with-kaggle-titanic-problem。ipynb getting-started-with-kaggle-titanic-problem.py
上面的命令将创建一个名为“YourFileName.py”的python脚本,根据我们的示例,它将创建一个“getting-start -with-kaggle-titanic-problem.py”文件