cOldpure 发表于 2019-12-28 15:47

使用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:41

本帖最后由 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

yjn866y 发表于 2019-12-28 16:22

学习学习。。。。

毋庸讳言 发表于 2019-12-28 16:36

这个怎么使用呢?

王星星 发表于 2019-12-28 17:05

cj13888 发表于 2019-12-29 11:23


学习借鉴一下,谢谢分享

颠覆1 发表于 2019-12-29 16:39

求告知怎么使用

cOldpure 发表于 2019-12-29 16:57

颠覆1 发表于 2019-12-29 16:39
求告知怎么使用

Anki 是一个记忆类软件将生成的 apkg 直接导入即可

酷酷的囍 发表于 2020-1-3 23:20

楼主牛逼

cOldpure 发表于 2020-2-26 09:53

icehack 发表于 2020-2-19 00:41
from get_text import get_txt   
少了个get_text的源吗,编译报错



是的 谢谢;www
页: [1] 2 3
查看完整版本: 使用python3 生成 Anki 单词记忆牌库