Skip to content

Instantly share code, notes, and snippets.

@krmanik
Created September 28, 2021 11:59
Show Gist options
  • Save krmanik/e2cb3f6cde032e5a5dedaa619d7de487 to your computer and use it in GitHub Desktop.
Save krmanik/e2cb3f6cde032e5a5dedaa619d7de487 to your computer and use it in GitHub Desktop.
Create Anki deck using Jupyter Notebook

Where to use the notebook?

Google Colab

Download raw csv_to_anki_apkg.ipynb file and upload to https://colab.research.google.com

How to use this?

  1. Add CSV/TSV file in same directory
  2. Run Second cell to install genanki
  3. Run Next cell and enter
  • csv/tsv filename
  • deck title
  • model
  • filed separated by tab or comma
  • fields
  1. The file with .apkg extension will be generated in same directory
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "csv_to_anki_apkg.ipynb",
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "code",
"metadata": {
"id": "xtuktLotottc"
},
"source": [
"# CSV to .apkg in browser"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ZSgYYf_rozx7"
},
"source": [
"!pip install genanki"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "nq6N_UAko3K3"
},
"source": [
"\"\"\"\n",
"Author: Mani\n",
"\"\"\"\n",
"\n",
"import random\n",
"import genanki\n",
"import csv\n",
"import traceback\n",
"import os.path\n",
"from os import path\n",
"\n",
"def exportDeck():\n",
"\n",
" data_filename = str(input(\"Enter input file name with extension: \"))\n",
"\n",
" if not path.exists(data_filename):\n",
" print(\"File not exists\")\n",
" quit()\n",
"\n",
" anki_deck_title = str(input(\"Enter title of deck: \"))\n",
"\n",
" if len(anki_deck_title) == 0:\n",
" print(\"Empty title\")\n",
" quit()\n",
"\n",
" # model name\n",
" r1 = str(random.randrange(1 << 10, 1 << 11))\n",
" anki_model_name = str(input(\"Enter model of deck: \"))\n",
" anki_model_name = anki_model_name + \"-Basic-\" + r1\n",
"\n",
" delim = \"\\t\"\n",
"\n",
" d = str(input(\"Fields are separated by (tab, comma): \"))\n",
" if d == \"TAB\" or d == \"tab\": \n",
" delim = \"\\t\"\n",
" elif d == \"COMMA\" or d == \"comma\": \n",
" delim = \",\"\n",
" else:\n",
" print(\"Not supported...\")\n",
"\n",
" csv_fields = []\n",
" fields = []\n",
"\n",
" f = open(data_filename, 'r', encoding='utf-8')\n",
"\n",
" reader = csv.reader(f, delimiter=delim)\n",
" ncol = len(next(reader))\n",
"\n",
" for i in range(ncol):\n",
" msg = \"Enter field \" + str(i) + \" name: \"\n",
" field = str(input(msg))\n",
" csv_fields.append({\"name\": field})\n",
" fields.append(field)\n",
"\n",
" # exported deck name\n",
" r2 = str(random.randrange(1 << 15, 1 << 16))\n",
"\n",
" deck_filename = \"export_\" + r2 + \".apkg\"\n",
"\n",
" try:\n",
" back = \"\"\n",
" front = \"<div>{{\" + str(fields[0]) + \"}}</div>\"\n",
"\n",
" for field in fields:\n",
" back += \"<div>{{\" + str(field) + \"}}</div>\\n\"\n",
"\n",
" model_id = random.randrange(1 << 30, 1 << 31)\n",
"\n",
" style = \"\"\"\n",
".card {\n",
"font-family: arial;\n",
"font-size: 20px;\n",
"text-align: center;\n",
"color: black;\n",
"background-color: white;\n",
"}\n",
"\"\"\"\n",
" # print(self.fields)\n",
" anki_model = genanki.Model(\n",
" model_id,\n",
" anki_model_name,\n",
" fields=csv_fields,\n",
" templates=[\n",
" {\n",
" \"name\": \"Card 1\",\n",
" \"qfmt\": front,\n",
" \"afmt\": back,\n",
" },\n",
" ],\n",
" css=style,\n",
" )\n",
"\n",
" anki_notes = []\n",
"\n",
" with open(data_filename, \"r\", encoding=\"utf-8\") as csv_file:\n",
" csv_reader = csv.reader(csv_file, delimiter=delim)\n",
" for row in csv_reader:\n",
" flds = []\n",
" for i in range(len(row)):\n",
" flds.append(row[i])\n",
"\n",
" anki_note = genanki.Note(\n",
" model=anki_model,\n",
" fields=flds,\n",
" )\n",
" anki_notes.append(anki_note)\n",
"\n",
" #random.shuffle(anki_notes)\n",
"\n",
" anki_deck = genanki.Deck(model_id, anki_deck_title)\n",
" anki_package = genanki.Package(anki_deck)\n",
"\n",
" for anki_note in anki_notes:\n",
" anki_deck.add_note(anki_note)\n",
"\n",
" anki_package.write_to_file(deck_filename)\n",
"\n",
" print(\"Deck generated with {} flashcards\".format(\n",
" len(anki_deck.notes)))\n",
" \n",
" except:\n",
" traceback.print_exc()\n",
" print(\"Deck Creation Failed!\")\n",
"\n",
"exportDeck()"
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment