Python notebooks samenvoegen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • baue22
  • Registratie: April 2018
  • Laatst online: 30-04-2024
Goedendag,

Ik ben nu al een tijdje aan het zoeken naar een manier om mijn python notebooks samen te voegen tot 1 notebook. Ik ben nog wat nieuw in Python dus misschien zie ik wel een simpele optie over het hoofd. Maar het lijkt mij niet om de inhoud van het ene notebook te kopiëren in het andere notebook. De enige manier waarop mij dit is gelukt is door alle cellen om de beurt te selecteren met ctrl+j en vervolgens te kopiëren en te plakken. Maar ik zou graag 8 notebooks willen samenvoegen met een totaal van bijna 1000 cellen, dit lijkt mij dus niet de goede manier om dit aan te pakken.

Nu heb ik op internet een soort plugin gevonden, die nbmerge heet. Ik heb die geïnstalleerd en (volgens mij) de juiste commando's uitgevoerd om het te laten slagen. Ik moest in een terminal de volgende command invoeren:
code:
1
!nbmerge file_1.ipynb file_2.ipynb file_3.ipynb > merged_ouput.ipynb

Maar als ik dit doe krijg ik de melding:

Traceback (most recent call last): File "/Users/user/opt/anaconda3/bin/nbmerge", line 8, in sys.exit(main()) File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/nbmerge/init.py", line 189, in main plan = parse_plan(args) File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/nbmerge/init.py", line 173, in parse_plan raise IOError("Notebook {} does not exist".format(file_path)) OSError: Notebook 1.1_Introduction_variables_expressions_statements.ipynb does not exist

Terwijl de file 1.1_Introduction_variables_expressions_statements.ipynb wel op mijn PC staat.

Kan iemand mij helpen? een andere manier dan de NBmerge plugin is ook helemaal welkom!
Ik zie graag jullie reacties tegemoet!

Alle reacties


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
baue22 schreef op woensdag 7 april 2021 @ 17:09:
Terwijl de file 1.1_Introduction_variables_expressions_statements.ipynb wel op mijn PC staat.
En er zit geen typo in de filenaam? Hoofdletters/kleine letters? Zoiets? Spatie(s) in het pad?

Verder: die vragen die er staan wanneer je hier een nieuw topic opent staan er natuurlijk niet voor niets:
Mijn vraag
...

Relevante software en hardware die ik gebruik
...

Wat ik al gevonden of geprobeerd heb
...
Ik mis in dit topic, maar ook je vorige topics, eigenlijk wat je zélf al gezocht, gevonden en geprobeerd hebt. Zie ook onze Quickstart. We willen je best helpen of in de juiste richting wijzen, maar we zijn niet baue22's persoonlijke helpdesk ;)

[ Voor 59% gewijzigd door RobIII op 07-04-2021 17:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • baue22
  • Registratie: April 2018
  • Laatst online: 30-04-2024
@RobIII Bedankt voor je feedback, sorry als het zo overkomt, maar ik probeer wel degelijk eerst zelf research te doen voordat ik een topic maak voor het probleem.
Ik heb voor dit probleem al gezocht en ik kwam uit bij ctrl+j om alles te selecteren en op die manier te kopiëren en te plakken. Dit is echter geen oplossing omdat het niet gaat om een aantal cells maar om meerdere grote notebooks.
Verder vond ik bovengenoemde plugin nbmerge op github. Het installatieproces staat daar beschreven maar niet hoe de applicatie wordt toegepast behalve deze command:
code:
1
!nbmerge file_1.ipynb file_2.ipynb file_3.ipynb > merged_ouput.ipynb


Nu heb ik dit geprobeerd en kreeg de foutmelding die ook hierboven staat. Zoeken op de foutmelding levert geen resultaten en ook door te zoeken op nbmerge werd ik niet wijzer. Ik dacht dat het aan mij lag en dat ik verkeerd googelde. Daarom vroeg ik het hier.

Ik heb overigens nog uw eerdere reactie gezien en dit geprobeerd. Eerst had ik alleen de namen van de notebooks (zoals, volgens mij, in het voorbeeldcommando staat beschreven) geprobeerd. Op uw aanraden daarna toch maar met het volledige pad in het commando geprobeerd, maar helaas kreeg ik weer dezelfde foutmelding.

Ik waardeer alle reacties hier enorm en ik begrijp ook dat ik zelf eerst goede research moet doen. Ik zou het ook al enorm waarderen als iemand mij vertelt waar ik wel op moet zoeken om de oplossing zelf te vinden!

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
baue22 schreef op woensdag 7 april 2021 @ 19:15:
@RobIII Bedankt voor je feedback, sorry als het zo overkomt, maar ik probeer wel degelijk eerst zelf research te doen voordat ik een topic maak voor het probleem.
Maar als je dat niet vermeldt kunnen wij het niet ruiken ;) Daarom vragen we er om dat metéén te vermelden zodat we onze tijd niet hoeven verdoen met dingen aandragen die je allang geprobeerd hebt.
Ik heb voor dit probleem al gezocht en ik kwam uit bij ctrl+j om alles te selecteren en op die manier te kopiëren en te plakken.
Wat je hebt geprobeerd om je probleem (de foutmelding uit je topicstart) op te lossen natuurlijk 8)7
Ik heb overigens nog uw eerdere reactie gezien en dit geprobeerd. Eerst had ik alleen de namen van de notebooks (zoals, volgens mij, in het voorbeeldcommando staat beschreven) geprobeerd. Op uw aanraden daarna toch maar met het volledige pad in het commando geprobeerd, maar helaas kreeg ik weer dezelfde foutmelding.
En er zit dus 200% zeker weten geen fout in de bestandsnaam (hoofdletters/kleine letters, spaties of andere gekke tekens in het pad oid)? Wat is het volledige pad van de bestanden? Is het wellicht een rechtenprobleem? De foutmelding lijkt me namelijk vrij duidelijk te communiceren dat het bestand niet gevonden kan worden:
baue22 schreef op woensdag 7 april 2021 @ 17:09:
Traceback (most recent call last):
File "/Users/user/opt/anaconda3/bin/nbmerge", line 8, in sys.exit(main())
File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/nbmerge/init.py", line 189, in main plan = parse_plan(args)
File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/nbmerge/init.py", line 173, in parse_plan raise IOError("Notebook {} does not exist".format(file_path)) OSError: Notebook 1.1_Introduction_variables_expressions_statements.ipynb does not exist
Als ik de source er bij pak en naar die betreffende line 173 ga lijkt dat bevestigd te worden:
Python:
1
2
if not os.path.exists(file_path):
    raise IOError("Notebook `{}` does not exist".format(file_path))
Ik waardeer alle reacties hier enorm en ik begrijp ook dat ik zelf eerst goede research moet doen. Ik zou het ook al enorm waarderen als iemand mij vertelt waar ik wel op moet zoeken om de oplossing zelf te vinden!
Het begint vooral met de foutmelding goed lezen, desnoods daar steekwoorden uit te destilleren en daarop te googlen en vooral te verifiëren of alles wel klopt en overeenkomt met je verwachtingen.

[ Voor 24% gewijzigd door RobIII op 07-04-2021 19:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

  • baue22
  • Registratie: April 2018
  • Laatst online: 30-04-2024
Het is me gelukt op een andere manier. Deze code in een notebook in dezelfde map als de files die je wilt combineren en dan alleen nog de code executen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# generate list of files to be merged
notebooks_to_merge = [file for file in os.listdir(os.getcwd()) if file.endswith('.ipynb')]

# list should be in the order in which you want the notebooks to be merged
# my notebooks are labeled 1.ipynb, 2.ipynb... in the order I want
notebooks_to_merge.sort()

print(notebooks_to_merge)

def combine_ipynb_files(list_of_notebooks, combined_file_name):
    
    '''
    parameters:
    `list_of_notebooks` is an ordered list of your .ipynb files to be merged
    `combined_file_name` is the name of your combined .ipynb file which will be generated by this function
    
    returns: the filepath of the new file
    '''
    
    with open (notebooks_to_merge[0], mode = 'r', encoding = 'utf-8') as f:
        a = json.load (f)
    
    for notebook in notebooks_to_merge[1:]:
        with open (notebook, mode = 'r', encoding = 'utf-8') as f:
            b = json.load(f)
            a['cells'].extend (b['cells']) 
                # extend here, not append, so that each dictionary in b['cells']
                # is added to new dictionary in a['cells']

    with open(combined_file_name, mode='w', encoding='utf-8') as f:
        json.dump(a, f)
    
    print('Generated file: "{}".'.format(combined_file_name))
    
    return (os.path.realpath(combined_file_name))

combine_ipynb_files(notebooks_to_merge, "combined.ipynb")