医学闪卡自动标签脚本报错:genanki无Collection属性求助
解决genanki无Collection属性报错及批量给Anki卡片加标签的方案
核心报错原因
genanki的设计定位是生成新的Anki卡组(.apkg文件),它没有提供读取本地已有的collection.anki2数据库的功能,所以genanki.Collection这个类根本不存在——这就是你报错的根源。
可行解决方案(针对批量操作本地13.6万张卡片)
方案1:使用Anki官方Python接口
Anki本身自带可操作collection的Python模块,步骤如下:
- 将Anki的安装目录(比如
C:\Program Files\Anki)添加到Python的环境变量sys.path中 - 导入
anki模块,使用anki.Collection来打开本地数据库
示例代码片段:
import sys sys.path.append(r"C:\Program Files\Anki") from anki.collection import Collection # 打开本地collection collection_path = r"C:\Users\Doug\AppData\Roaming\Anki2\Convertor\collection.anki2" col = Collection(collection_path)
方案2:直接操作SQLite数据库(推荐批量操作)
collection.anki2本质是SQLite数据库,用sqlite3模块直接操作效率更高,适合处理13万张卡片的批量任务:
- 连接数据库
- 查询目标卡组的笔记ID
- 根据关键词匹配更新标签
示例代码片段:
import sqlite3 import re # 连接数据库 conn = sqlite3.connect(r"C:\Users\Doug\AppData\Roaming\Anki2\Convertor\collection.anki2") cursor = conn.cursor() # 定义分类关键词 categories = { 'diagnosis': ['diagnosis', 'symptoms', 'signs'], 'treatment': ['treatment', 'management', 'therapy'], 'anatomy': ['anatomy'], 'physiology': ['physiology'], 'pathology': ['pathology'], 'pharmacology': ['pharmacology', 'drugs', 'medications'], 'microbiology': ['microbiology', 'infectious'], 'surgery': ['surgery', 'procedures', 'operative'], 'radiology': ['radiology', 'imaging', 'scans'], } # 查询目标卡组的笔记(替换为你的卡组名称) cursor.execute("SELECT id, flds FROM notes WHERE did = (SELECT id FROM decks WHERE name = '你的卡组名称')") notes = cursor.fetchall() for note_id, flds in notes: tags = set() # 检查字段内容是否匹配关键词 for category, keywords in categories.items(): for keyword in keywords: if re.search(keyword, flds, re.IGNORECASE): tags.add(category) # 更新笔记标签 cursor.execute("UPDATE notes SET tags = ? WHERE id = ?", (','.join(tags), note_id)) conn.commit() conn.close()
现有代码的其他关键错误修复
不管用哪种方案,你原代码里的这些错误必须修正:
- 路径重复拼接:
collection_path = os.path.join(anki_path, "C:\Users\Doug\AppData\Roaming\Anki2\Convertor\collection.anki2")这里重复了绝对路径,直接用完整路径即可 - 语法错误:
tags.add(category)少了括号,应改为tags.add(category) - 缩进错误:
for url in urls:循环内的标签处理、后续的if url in existing_cards:判断都缩进错误,导致逻辑完全混乱 - 变量名不一致:最后保存时用了
col.decks.save(deck),但前面定义的是collection,变量名不匹配 - 逻辑错误:
existing_cards的键是note.fields[0],但后续判断url in existing_cards,如果fields[0]不是URL,这个判断永远不成立
内容的提问来源于stack exchange,提问作者Dogebooch
相关产品推荐
相关产品推荐

