使用python3 生成 Anki 单词记忆牌库
本帖最后由 cOldpure 于 2020-2-26 09:48 编辑简单的使用genanki 这个库即可 我的做法是所有的单词存在一个excel中 第一列是单词 第三列是释义 其实只需要 有一个单词也就是内容列表即可
```
import genanki
import xlrd
from get_media import get_txt, get_mp3
my_deck = genanki.Deck(
2059400110,
'英语(二) 4500单词')
# anki 的牌model 可以根据自己的想法设置
my_model = genanki.Model(
1091735104,
'Simple Model with Media',
# 这里是传入fields 的变量代名
fields=[
{'name': 'Question'},
{'name': 'Answer'},
{'name': 'MyMedia'},
{'name': 'Text'}# ADD THIS
],
# 直接将你传入的 变量 通过代名 写入模版 html还是很好理解的
templates=[
{
'name': 'Card 1',
'qfmt': '{{Question}}<br>{{MyMedia}}',# AND THIS
'afmt': '{{FrontSide}}<hr id="answer">{{Answer}}<hr id="text">{{Text}}',
},
])
def read_xlsx():
workbook = xlrd.open_workbook("4500.xlsx")
Words = workbook.sheet_by_name("Sheet1")
rows = Words.nrows
word_list= []
# 便利了excel中 第一行 所有的单词
for x in range(0,rows):
# 对 带有/ 的双词及 带有 ()的情况做丢弃处理
word_str = Words.row(x).value.split('(').split('/')
# 中文释义 是第三列的内容
answer= Words.row(x).value
# 获取例句
text_list = get_txt(word_str)
text = ''
for x in text_list:
text += "<br>" + x
my_note = genanki.Note(
model=my_model,
# 变量传入牌面
# fields=[
# {'name': 'Question'},
# {'name': 'Answer'},
# {'name': 'MyMedia'},
# {'name': 'Text'}# ADD THIS
# ],
# 依次传入 sound 只要传入该文件名即可 这个是在anki的内部对封装在apkg内的音频调用不用有本机路径
fields=', text])
# 获取音频
filepath = get_mp3(word_str)
if filepath:
# 文件路径的列表
word_list.append(filepath)
print(word_str)
my_deck.add_note(my_note)
print('list:', word_list)
my_package = genanki.Package(my_deck)
# 这里才是音频压入apkg的地方 将所有音频文件路径 传入anki
my_package.media_files = [ x for x in word_list]
print(my_package.media_files)
my_package.write_to_file("4500.apkg")
if __name__ == '__main__':
read_xlsx()
```
另外的 音频和 例句接口文件名 get_media.py
```
import os
import traceback
import requests
from pyquery import PyQuery as pq
def get_txt(word):
api = f"http://dict.kekenet.com/en/{word}"
try:
resp = requests.get(api, timeout=10)
if resp.status_code == 200:
html = resp.content
doc = pq(html)
return doc.find("#s_ul").text().split('\n')
except:
print("请求出错!")
traceback.print_exc()
return ["无例句", "无例句"]
def get_mp3(word):
api = f"http://media.shanbay.com/audio/us/{word}.mp3"
filepath = f"./mp3/{word}.mp3"
try:
if not os.path.exists(filepath):
res = requests.get(api, timeout=5)
if res.status_code == 200:
with open(filepath, "wb") as file:
file.write(res.content)
return filepath
else:
print("获取失败 可能是单词拼写错误")
else:
return filepath
except:
print('下载mp3 请求出错')
if __name__ == '__main__':
get_txt("america")
```
附上我生成的自考 00015 英语(二) 要求的4500单词 anki牌库 带音频和 例句
https://www.lanzouj.com/i8bhlcj
本帖最后由 icehack 于 2020-2-19 00:50 编辑
from get_text import get_txt
少了个get_text的源吗,编译报错
get_mp3, get_txt是不是都是引用get_media.py文件里的函数,我代码要改成下面的就不报错了
import genanki
import xlrd
# from get_text import get_txt
from get_media import get_mp3, get_txt 学习学习。。。。 这个怎么使用呢?
学习借鉴一下,谢谢分享 求告知怎么使用
颠覆1 发表于 2019-12-29 16:39
求告知怎么使用
Anki 是一个记忆类软件将生成的 apkg 直接导入即可 楼主牛逼 icehack 发表于 2020-2-19 00:41
from get_text import get_txt
少了个get_text的源吗,编译报错
是的 谢谢;www