Advanced Fill in the Blanks ist ein ganz toller Inhaltstyp und sollte häufiger genutzt werden.
Wie das jetzt einfach und schnell möglich ist, wird hier vorgestellt!

Die zahlreichen Variationen und Einstellungsmöglichkeiten sind im Abschnitt Differenzierung der H5P-Workflows zu finden.
Advanced Fill in the Blanks
Advanced Fill in the Blanks.jpg
 

Einleitung

Im Rahmen der Arbeiten am Angebot Differenzierung ist ein stärker Fokus auf den Inhaltstypen Advanced Fill in the Blanks gefallen.

Leider ist die Erstellung verhältnismäßig aufwendig, weshalb der Versuch gestartet wurde, die Erstellung via CSV-Vorlage und Python zu optimieren.

Das Ergebnis scheint ganz erfolgreich zu sein.

Was brauchen wir hierfür auf dem PC?

Hierfür benötigen wir Python und es muss (z.B. via Windows PowerShell - geht sicher auch auf Apple - das Paket pandas installiert sein – das ist eine sehr beliebte Bibliothek, die zum Einlesen von CSV-Dateien verwendet wird.)

Wie installiere ich das pandas Paket?

Öffne deine Eingabeaufforderung / Terminal / PowerShell und gib dort ein: pip install pandas

Wenn du mehrere Versionen von Python installiert hast, und das nicht klappt, versuche stattdessen: python -m pip install pandas

Oder falls du Python 3 mit explizitem Befehl aufrufen musst: python3 -m pip install pandas

Wenn du die Meldung bekommst Requirement already satisfied, ist es schon drauf – alles gut!

Dann muss das Python-Skript und die CSV-Vorlage mit den aktuellen Eingaben in einen Ordner. Über die Windows-Eingabeaufforderung muss jetzt im passenden Ordner

dieser Befehl ausgeführt werden: python generate_content_json.py

 

Komplett automatisierte H5P-Datei-Erstellung mit Python


Der Ablauf des Python-Skripts:

  1. Die CSV-Datei wird gelesen
  2. Die content.json automatisch generiert
  3. Eine vorhandene H5P-Datei (deine Vorlage) genutzt
  4. Die content.json austauscht
  5. Eine neue und fertige .h5p-Datei erzeugt

Die CSV-Vorlage

Satz Lösung Tipp Vom Nutzer eingegebene falsche Antwort 1 Rückmeldung Vom Nutzer eingegebene falsche Antwort 2 Rückmeldung Vom Nutzer eingegebene falsche Antwort 3 Rückmeldung Vom Nutzer eingegebene falsche Antwort 4 Rückmeldung
Der *Deutsche Bundestag* ist das Parlament der Bundesrepublik Deutschland und repräsentiert das Volk auf Bundesebene. Deutsche Bundestag D _ _ _ _ _ _ _ B _ _ _ _ _ t _ _ Deutscher Bundesrat Der Bundesrat ist die Länderkammer. Bayerische Landtag Das ist das Landesparlament des Freistaats Bayern. Deutsche Bundesversammlung Die Deutsche Bundesversammlung setzt sich aus dem Bundestag und der Vertretungen des Bundesrates zusammen.
Die Abgeordneten des Bundestages werden alle *vier* Jahre gewählt – in der Regel durch eine allgemeine, unmittelbare, freie, gleiche und geheime Wahl. vier Kürzer als fünf Jahre zwei Zwei Jahre sind zu wenig. drei Drei Jahre sind zu wenig. fünf Auf fünf Jahre wird der/die Bundespräsident:in gewählt.
                     
Eine zentrale Aufgabe des Bundestages ist die *Gesetzgebung*, also das Beschließen neuer Gesetze oder das Ändern bestehender Gesetze. Gesetzgebung siehe Nebensatz Lobbyarbeit Nein, die Lobbyarbeit versucht Einfluss zu nehmen. Die Wahl der Verfassungsorgane. Dies sind auch Aufgaben, aber nicht die zentrale Aufgabe. Die Vertretung Deutschlands im Ausland. Nein, das macht das Auswertige Amt und der/die Bundespräsident:in
                     
Der Bundestag wählt den/die *Bundeskanzler:in*, der bzw. die anschließend vom Bundespräsidenten ernannt wird. Bundeskanzler:in Diese Amt hat die Richtlinienkompetenz. Bundespräsident:in Nein, diese Verfassungsorgan wird durch die Bundesversammlung gewählt. Die Ministerpräsident:innen Nein, die werden durch die Landesparlamente gewählt. Die Bundesminster:innen Nein, diese werden durch die/den Bundespräsident:in ernannt.
                     
Der Bundestag kontrolliert die *Regierung*, unter anderem durch Anfragen, Debatten und Untersuchungsausschüsse. Regierung Wird idR durch eine Koalition gebildet. Bundesversammlung Nein, diese wählt die/den Bundespräsident:in. Landesregierung Das ist die Aufgabe der Landesparlamente. Oppositon Die Hauptaufgabe der Opposition ist Kontrolle!

Das Ergebnis sieht so aus: https://apps.zum.de/apps/40765

Die Schritt-für-Schritt-ErstellungBearbeiten

Schritt 1: Was brauchen wir hierfür:Bearbeiten

  • Einen eigenen leeren Ordner
  • Die angepasste CSV-Datei dort speichern
  • Eine H5P-Vorlagendatei, also z. B. eine .h5p, die du manuell erstellt hast (mit dem richtigen Typ: Advanced Fill in the Blanks)

Schritt 2: Die Vorlage umbenennen in: vorlage.h5pBearbeiten

Diese im selben Ordner wie das Skript und die CSV abspeichern.

Schritt 3: Das Python-SkriptBearbeiten

import pandas as pd
import json
import zipfile
import shutil
import os

# === Pfade definieren ===
csv_path = "Eingabe Advanced Fill in the Blanks - Tabelle.CSV"
h5p_vorlage = "vorlage.h5p"
neue_h5p = "mein_output.h5p"
temp_dir = "temp_h5p"

# === Schritt 1: CSV einlesen und content.json erzeugen ===
df = pd.read_csv(csv_path, sep=';', encoding='utf-8')
df.columns = df.columns.str.strip()

def create_blanks_text(s):
    return s.replace("*", "____")

content = {
    "blanksText": "",
    "blanksList": []
}
blanks = []
texts = []

for _, row in df.iterrows():
    if pd.isna(row['Satz']):
        continue

    texts.append(f"<p>{create_blanks_text(row['Satz'])}</p>")
    correct = row['Lösung']
    hint = row.get('Tipp', None)

    incorrects = []
    for i in range(1, 5):
        wrong = row.get(f'Vom Nutzer eingegebene falsche Antwort {i}')
        feedback = row.get(f'Rückmeldung.{i-1}')
        if pd.notna(wrong):
            incorrects.append({
                "showHighlight": False,
                "highlight": "-1",
                "incorrectAnswerText": wrong,
                "incorrectAnswerFeedback": f"<div>{feedback or ''}</div>"
            })

    entry = {
        "correctAnswerText": correct,
        "incorrectAnswersList": incorrects
    }
    if pd.notna(hint):
        entry["hint"] = hint

    blanks.append(entry)

content["blanksText"] = "\n".join(texts)
content["blanksList"] = blanks

full_data = {
    "content": content,
    "behaviour": {
        "mode": "selection",
        "selectAlternatives": "alternatives",
        "selectAlternativeRestriction": 1,
        "spellingErrorBehaviour": "mistake",
        "caseSensitive": False,
        "autoCheck": False,
        "enableSolutionsButton": False,
        "showSolutionsRequiresInput": True,
        "enableRetry": True,
        "enableCheckButton": True
    },
    "showSolutions": "Lösung anzeigen",
    "tryAgain": "Wiederholen",
    "checkAnswer": "Überprüfen",
    "notFilledOut": "Bitte fülle alle Lücken aus, um die Lösung zu sehen",
    "tipLabel": "Tipp",
    "scoreBarLabel": "Du hast :num von :total Punkten erreicht."
}

# === Schritt 2: Vorlage entpacken ===
if os.path.exists(temp_dir):
    shutil.rmtree(temp_dir)

with zipfile.ZipFile(h5p_vorlage, 'r') as zip_ref:
    zip_ref.extractall(temp_dir)

# === Schritt 3: content.json ersetzen ===
with open(os.path.join(temp_dir, "content", "content.json"), "w", encoding="utf-8") as f:
    json.dump(full_data, f, ensure_ascii=False, indent=2)

# === Schritt 4: Alles wieder einpacken ===
with zipfile.ZipFile(neue_h5p, 'w', zipfile.ZIP_DEFLATED) as zipf:
    for root, _, files in os.walk(temp_dir):
        for file in files:
            abs_path = os.path.join(root, file)
            rel_path = os.path.relpath(abs_path, temp_dir)
            zipf.write(abs_path, rel_path)

print("✅ Neue H5P-Datei erfolgreich erstellt:", neue_h5p)

Schritt 4: Skript speichern und AusführenBearbeiten

Das Skript in einen Texteditor einfügen und mit der Dateiendung .py im gemeinsamen Ordner mit der CSV-Datei und der H5P-Vorlage abspeichern.

Durch einen Doppelklick wird das Skript ausgeführt und die neue H5P-Datei erstellt.

Der extra Ordner und seine Inhalte
Der extra Ordner und seine Inhalte

 

 

 

 

 

 

 

 

 

 

 

 

Fertig:-)

 

14.05.2025 - Patrick OberdOERfer