![]()
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 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 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:
- Die CSV-Datei wird gelesen
- Die content.json automatisch generiert
- Eine vorhandene H5P-Datei (deine Vorlage) genutzt
- Die content.json austauscht
- 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.

Fertig:-)
14.05.2025 - Patrick OberdOERfer
- 63 Aufrufe