-
-
Save arvind-india/7a040fda6d3a6a6e09624101c19bd47d to your computer and use it in GitHub Desktop.
Solve the automatically created `Untitled.txt` problem for Jupyter Lab. Automatically save a copy of notebook to the corresponding language source script, excluding notebooks with "Untitled" names.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment