Wie konvertiere ich ein IPython-Notebook über die Befehlszeile in eine Python-Datei?
Lesezeit: 6 Minuten
Stefan Krawczyk
Ich überlege, das zu verwenden *.ipynb Dateien als Quelle der Wahrheit und „kompilieren“ sie programmgesteuert in .py-Dateien für geplante Jobs/Aufgaben.
Die einzige Möglichkeit, die ich verstehe, ist die Verwendung der GUI. Gibt es eine Möglichkeit, dies über die Befehlszeile zu tun?
Was meinst du mit „Quelle der Wahrheit“? IPython-Notebooks sind nur JSON-Dateien. Sie können sie laden und als Python-Wörterbücher bearbeiten. Für den Quellcode sollten Sie iterieren input Schlüssel wo cell_type entspricht ‘Code’. Guck dir das an planen
– Theta
13. Juni 2013 um 1:03
Nun, ich möchte die .ipynb-Datei in einem Repository speichern und nicht die .py-Dateien. Als „Build-Schritt“ würde ich dann die .ipynb-Dateien in .py-Dateien konvertieren, damit sie tatsächlich vom automatisierten System verwendet werden können. Du hast recht, ich könnte einfach den JSON laden und nur die Codezellen ausgeben, aber ich habe mich gefragt, ob es da draußen schon etwas gibt, das das für mich erledigt 🙂
– Stefan Krawczyk
13. Juni 2013 um 1:17
wwwilliam
Wenn Sie nicht bei jedem Speichern ein Python-Skript ausgeben oder den IPython-Kernel nicht neu starten möchten:
Auf der Befehlszeilekönnen Sie verwenden nbconvert:
Als kleiner Hack, Sie können sogar den obigen Befehl aufrufen In ein IPython-Notebook durch Voranstellen ! (wird für jedes Befehlszeilenargument verwendet). In einem Notizbuch:
Vor --to script War hinzugefügtdie Option war --to python oder --to=pythonaber es war umbenannt auf dem Weg zu einem sprachunabhängigen Notizbuchsystem.
Wenn Sie bei jedem Speichervorgang einen haben möchten, klicken Sie hier jupyter Du kannst auslösen nbconvert über Pre- oder Post-Save-Hooks: ContentsManager.pre_save_hook abd FileContentsManager.post_save_hook. Sie würden einen Post-Save-Hook hinzufügen jupyter nbconvert --to script [notebook]
– jaimedash
3. Mai 2016 um 16:35 Uhr
Gibt es eine Möglichkeit, das Gegenteil zu tun, dh von einem Python-Skript in ein Notebook zu konvertieren? Zum Beispiel: Haben Sie einige spezielle Dokumentzeichenfolgen, die in Zellen analysiert werden?
– Sujen Shah
17. Januar 2017 um 17:40 Uhr
Konvertieren Sie alle Notizbücher in einem Ordner jupyter nbconvert --to script /path/to/notebooks/*.ipynb
– openwonk
22. Juli 2017 um 0:00 Uhr
Danke, es funktioniert!, aber was ist, wenn ich das nicht möchte? # In[ ]: Geben Sie Dinge in das Skript ein, ich möchte, dass es sauber ist. Gibt es eine Möglichkeit, das zu tun?
– Rishabh Agrahari
31. Januar 2018 um 10:48
@RishabhAgrahari Folgendes scheint für mich zu funktionieren. !jupyter nbconvert --to script --no-prompt notebook.ipynb
– Bytestorm
27. Mai 2019 um 7:09
Břetislav Hájek
Wenn Sie alle konvertieren möchten *.ipynb Dateien aus dem aktuellen Verzeichnis in das Python-Skript kopieren, können Sie den Befehl wie folgt ausführen:
jupyter nbconvert --to script *.ipynb
Oder Sie können Folgendes ausführen: ipython nbconvert –to script *.ipynb
– Andrej
23. Dezember 2020 um 11:28
Um programmgesteuert wie in einer Funktion zu konvertieren, verwenden Sie diese Syntax: subprocess.run([‘jupyter’, ‘nbconvert’,ipynb_file,”–to”, “script”,”–output”,r’temp_converted_py’],shell=True) beachten Sie, dass ipynb_file eine Variable ist
– Benutzer15420598
28. Dezember 2021 um 18:49 Uhr
Hier ist eine schnelle und schmutzige Möglichkeit, den Code aus V3 oder V4 ipynb zu extrahieren, ohne ipython zu verwenden. Zelltypen usw. werden nicht überprüft.
import sys,json
f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
for i,cell in enumerate(j["cells"]):
of.write("#cell "+str(i)+"\n")
for line in cell["source"]:
of.write(line)
of.write('\n\n')
else:
for i,cell in enumerate(j["worksheets"][0]["cells"]):
of.write("#cell "+str(i)+"\n")
for line in cell["input"]:
of.write(line)
of.write('\n\n')
of.close()
Beste Antwort, wenn Sie keines der Jupyter-Tools installieren möchten.
– dacracot
3. Okt. 2016 um 14:38
Ich mag das. Aber als ich das .py-Format von Jupyter-Notebooks herunterlade, habe ich herausgefunden, dass es UNIX-Zeilenenden verwendet, obwohl ich unter Windows arbeite. Um dasselbe zu generieren, fügen Sie das hinzu newlines='\n' als drittes Argument im Aufruf der offenen Ausgabedatei. (Python 3.x)
– RufusVS
30. Mai 2019 um 19:19 Uhr
Diese Antwort eröffnet die Möglichkeit, Tags zu lesen und nur die Zellen zu extrahieren, die sie enthalten. Über die Befehlszeile allein ist das schwieriger.
– Pablo Adames
9. August 2020 um 23:57 Uhr
Wayne
Jupytext ist schön, es für solche Konvertierungen in Ihrer Toolchain zu haben. Es ermöglicht nicht nur die Konvertierung von einem Notizbuch in ein Skript, sondern Sie können auch wieder vom Skript in ein Notizbuch zurückkehren. Und lassen Sie das Notizbuch sogar in ausgeführter Form anfertigen.
jupytext --to py notebook.ipynb # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py # convert notebook.py to an .ipynb file and run it
Befolgen Sie das vorherige Beispiel, jedoch mit dem Neue nbformat lib-Version :
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'))
Die letzte Codezeile von fh.writelines(source.encode(‘utf-8’)) gibt ‘TypeError: write() Argument muss str sein, nicht int’. fh.writelines(source) funktioniert jedoch.
– BarryC
18. Okt. 2016 um 5:43
Hatte das gleiche Problem, das durch Löschen des behoben wurde .encode('utf-8') Stück in der letzten Zeile.
– LFoos24
28. Juni 2021 um 17:18 Uhr
Ich habe das Problem mit der letzten Zeile beim Schreiben gelöst fh.write(source) anstatt fh.writelines(...).
– mosc9575
24. November 2021 um 14:33 Uhr
wwwslinger
Sie können dies über die IPython-API tun.
from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter
filepath="path/to/my_notebook.ipynb"
export_path="path/to/my_notebook.py"
with open(filepath) as fh:
nb = nbformat.reads_json(fh.read())
exporter = PythonExporter()
# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)
with open(export_path, 'w+') as fh:
fh.writelines(source)
Die letzte Codezeile von fh.writelines(source.encode(‘utf-8’)) gibt ‘TypeError: write() Argument muss str sein, nicht int’. fh.writelines(source) funktioniert jedoch.
– BarryC
18. Okt. 2016 um 5:43
Hatte das gleiche Problem, das durch Löschen des behoben wurde .encode('utf-8') Stück in der letzten Zeile.
– LFoos24
28. Juni 2021 um 17:18 Uhr
Ich habe das Problem mit der letzten Zeile beim Schreiben gelöst fh.write(source) anstatt fh.writelines(...).
– mosc9575
24. November 2021 um 14:33 Uhr
Sachin Hatikankan
Ich verstehe, dass dies ein alter Thread ist. Ich hatte das gleiche Problem und wollte die .pynb-Datei über die Befehlszeile in eine .py-Datei konvertieren.
Der obige Befehl erstellt ein Python-Skript mit dem Namen „YourFileName.py“ und wird gemäß unserem Beispiel erstellt getting-started-with-kaggle-titanic-problem.py Datei
14502800cookie-checkWie konvertiere ich ein IPython-Notebook über die Befehlszeile in eine Python-Datei?yes
Was meinst du mit „Quelle der Wahrheit“? IPython-Notebooks sind nur JSON-Dateien. Sie können sie laden und als Python-Wörterbücher bearbeiten. Für den Quellcode sollten Sie iterieren
input
Schlüssel wocell_type
entspricht ‘Code’. Guck dir das an planen– Theta
13. Juni 2013 um 1:03
Nun, ich möchte die .ipynb-Datei in einem Repository speichern und nicht die .py-Dateien. Als „Build-Schritt“ würde ich dann die .ipynb-Dateien in .py-Dateien konvertieren, damit sie tatsächlich vom automatisierten System verwendet werden können. Du hast recht, ich könnte einfach den JSON laden und nur die Codezellen ausgeben, aber ich habe mich gefragt, ob es da draußen schon etwas gibt, das das für mich erledigt 🙂
– Stefan Krawczyk
13. Juni 2013 um 1:17