英语单词默写本的制作

制作结果

单词词义默写本

实现源码

from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

def Read_csv_all(filename, encoding):
    # 读取csv文件中的所有单词
    ls = []
    fr = open(filename, 'r', encoding = encoding)
    for line in fr.readlines():
        items = line.strip('\n').split(',')
        for item in items:
            if item != None and item != '':
                ls.append(item)
    fr.close()
    return ls

def Add_content(table, row, col, word):
    # 将单词放到相应的单元格内
    cell = table.cell(row, col)
    cell.text = ''
    p = cell.paragraphs[0]
    p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
    word = p.add_run("{}  ".format(word))
    word.font.name = 'Times New Roman'
    word.font.size = Pt(16)
    Underline = p.add_run("                         ")
    Underline.font.size = Pt(16)
    Underline.underline = True

def Add_TableSeq(table, SeqBegin, SeqEnd):
    # 处理一个序列的单词,从SeqBegin到SeqEnd
    for i in range(SeqBegin, SeqEnd):
        Add_content(table, i, 0, Words_List[2*i])
        if 2*i + 1 < Amount:
            Add_content(table, i, 1, Words_List[2*i + 1])

document = Document()
Words_List = Read_csv_all('words.csv', encoding='UTF-8')
Amount = len(Words_List)
rownum = Amount // 2 + 1 if Amount % 2 else Amount // 2
colnum = 2
table = document.add_table(rows=rownum, cols=colnum, style='Table Grid')
Add_TableSeq(table, 0, rownum)
document.save('words.docx')

接下来介绍程序模块

一、数据读入模块

这里需要自行将单词数据转换成单词列表的形式,我将单词数据全部保存在csv文件中,故直接读取csv文件中的所有单词即可。

def Read_csv_all(filename, encoding):
    # 读取csv文件中的所有单词
    ls = []
    fr = open(filename, 'r', encoding = encoding)
    for line in fr.readlines():
        items = line.strip('\n').split(',')
        for item in items:
            if item != None and item != '':
                ls.append(item)
    fr.close()
    return ls

二、python-docx库

该程序需要的第三方库只有docx,因此只需要安装docx库就能实现该功能了。命令行输入以下指令便可以安装该包。

pip install python-docx

需要用到的子模块有Document,Pt以及WD_PARAGRAPH_ALIGNMENT。

from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

其中最重要的模块就是Document类,用来创建Document实例,进行docx文件的创建、编辑、修改以及保存。
Pt用来设置段落字体的大小。
WD_PARAGRAPH_ALIGNMENT中包括与段落位置相关的枚举类型常量,比如WD_PARAGRAPH_ALIGNMENT.LEFT指的是段落左对齐。
WD_PARAGRAPH_ALIGNMENT中其他设置如下:

type含义
WD_PARAGRAPH_ALIGNMENT.LEFT左对齐0
WD_PARAGRAPH_ALIGNMENT.CENTER居中1
WD_PARAGRAPH_ALIGNMENT.RIGHT右对齐2
WD_PARAGRAPH_ALIGNMENT.JUSTIFY两端对齐3
WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE分散对齐4

三、docx文件的编辑

首先初始化一个Document的实例

document = Document()

然后读入单词数据,生成单词列表,Amount变量记录单词总个数。
为了实现左右两侧的单词严格对齐,这里使用了表格作为容器。
rownum指的是表格的总行数,一行两个单词,故rownum为2除单词个数向上取整。colnum为列数,固定为2。

Words_List = Read_csv_all('words2.csv', encoding='UTF-8')
Amount = len(Words_List)
rownum = Amount // 2 + 1 if Amount % 2 else Amount // 2
colnum = 2

接下来是程序的关键代码
初始化表格,表格的格式为Table Grid。选用这种格式是因为它没有背景色。

table = document.add_table(rows=rownum, cols=colnum, style='Table Grid')

下述两种代码都是在单元格内新建段落,但是为什么我选择了前者呢?

def Add_content(table, row, col, word):
    # 将单词放到相应的单元格内
    cell = table.cell(row, col)
    cell.text = ''
    p = cell.paragraphs[0]
p = table.cell(row, col).add_paragraph()

这是因为后者在新建段落时前面插入了一个换行符,结果如下图所示。
实现结果
而用前面的方法新建段落就不会这样。

下面设置单元格内段落所含文本的格式。

    p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT 	# 段落左对齐
    word = p.add_run("{}  ".format(word))		# 段落添加单词
    word.font.name = 'Times New Roman'			# 文本字体style设置
    word.font.size = Pt(16)						# 文本字体大小设置
    Underline = p.add_run("                         ")
    Underline.font.size = Pt(16)
    Underline.underline = True					# 下划线

最后处理所有的单元格

def Add_TableSeq(table, SeqBegin, SeqEnd):
    # 处理一个序列的单词,从SeqBegin到SeqEnd
    for i in range(SeqBegin, SeqEnd):
        Add_content(table, i, 0, Words_List[2*i])
        if 2*i + 1 < Amount:
            Add_content(table, i, 1, Words_List[2*i + 1])

四、运行结果处理

最后运行的结果可能看不到下划线,如下图所示
无下划线

要在word文件->选项->高级中将为尾部空格添加下划线选项勾选

修改选项
然后将表格设置成无框线即可完成制作。单词较多时运行时间较长,请耐心等待。

感谢大家的阅读!有不对的地方请在评论区加以指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值