1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| import csv
import json
import requests
import os
# 设置 AnkiConnect 的 URL
ankiconnect_url = "http://localhost:8765"
def create_deck(deck_name):
"""
使用 AnkiConnect API 创建一个新的牌组。
参数:
deck_name (str): 要创建的新牌组的名称。
返回:
dict: 从 AnkiConnect API 返回的响应,包含结果和错误(如果有)。
"""
request = {
"action": "createDeck",
"version": 6,
"params": {
"deck": deck_name
}
}
response = requests.post(ankiconnect_url, json=request)
response_json = response.json()
return response_json
def create_anki_card(note_data, deck_name):
# 构建 AnkiConnect 的请求数据
request = {
"action": "addNote",
"params": {
"note": {
"deckName": deck_name,
"modelName": "form",
"fields": note_data
}
}
}
# 发送 POST 请求到 AnkiConnect
response = requests.post(ankiconnect_url, json=request)
response_json = response.json()
# 检查是否有错误,如果是因为重复卡片而失败,则返回 None
if isinstance(response_json, dict) and "error" in response_json:
if response_json["error"] == "cannot create note because it is a duplicate":
return None
elif response_json["error"] == "deck not found":
# 如果找不到卡组,则先创建它
create_deck_result = create_deck(deck_name)
if "error" in create_deck_result:
print(f"创建牌组 '{deck_name}' 时出错: {create_deck_result['error']}")
return None
else:
# 然后再次尝试创建卡片
response = requests.post(ankiconnect_url, json=request)
response_json = response.json()
return response_json
else:
# 其他类型的错误,直接返回
return response_json
else:
return response_json
# 遍历所有 CSV 文件并创建卡片
for i in range(1, 50):
file_name = f"Unit B{i}.csv"
deck_name = f"UnitB{i}"
if os.path.exists(file_name):
with open(file_name, "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file)
for row in reader:
note_data = {
"numA": row["numA"],
"meanA": row["meanA"],
"words_A": row["words_A"],
"numB": row["numB"],
"meanB": row["meanB"],
"words_B": row["word_B"]
}
result = create_anki_card(note_data, deck_name)
if result is not None:
print(result)
else:
print(f"跳过重复的卡片: {note_data}")
|