Open lzcapp opened 5 days ago
谢谢大佬,原帖已经回复https://github.com/lzcapp/KindleMate2/issues/6#issuecomment-2496549724
在这里补充一下,根据anki的说明,CSV文件最开始几行可以加上header,这样Anki在导入的时候能直接根据header设置相应格式和选项
方式是
比如
这表示文件的列是用逗号分隔的(这个可以和导出时的分隔符一致,还可以是Tab、Semicolon等等),html格式启用,notetype是Test,牌组是Chinese。
所有header支持的key和value在这里: https://docs.ankiweb.net/importing/text-files.html#file-headers
要是可以让用户在导出前设定header就更好了,这样Anki导入的时候直接都设置好了。
@Steven630 也就是说先不管headers,我至少需要做到导出一个csv文件,这样在Anki中就能一一对应和导入了?
是的,有了CSV就可以。CSV建议所有的元素都单独成列,用户在Anki导入的时候选择哪些需要、对应到哪个field就可以了。
单词也是一样的(单词、原形、上下文、书籍、作者、语言、时间等等信息都各为一列)。以前的Kindle Mate生词本应该是有导出为CSV功能的,标注没试过。
截图左边是用户Anki卡片自带的fields,右边可选的就是CSV每列的表头,标注导出功能实现后。Anki导入界面右边这栏就可以自主选择“标记内容”、“书名”、“位置”等等,也可以选择nothing跳过。
目前需要的第一步只是把那些信息都变成一个大CSV。
第一张截图是用Python把生词本转换为CSV格式的做法,第二张就是Anki导入相应CSV的界面。
with open(export_path, 'w', newline='', encoding='utf-8') as csvfile:
# Write Anki import settings as headers
csvfile.write("#separator:Comma\n")
csvfile.write("#html:true\n")
csvfile.write("#tags:\n")
csvfile.write("#columns:Front,Back,AI\n")
csvfile.write(f"#notetype:{notetype}\n")
csvfile.write(f"#deck:{deck}\n")
csvfile.write("#notetype column:\n")
csvfile.write("#deck column:\n")
csvfile.write("#tags column:\n")
csvfile.write("#guid column:\n")
csvfile.write("#existing notes:duplicate\n")
csvfile.write("#match scope:notetype and deck\n")
# Write data rows
writer = csv.writer(csvfile)
for word in words:
# Map fields to values
front = word[3] # 'stem'
back = word[1] # 'usage'
ai = word[6]
# Write row
writer.writerow([front, back, ai, notetype, deck])
根据上面的代码,似乎是要加一行表示各列内容的header才行,否则Anki不一定能识别
csvfile.write("#columns:Front,Back,AI\n")
@Steven630 在 #6 提出: