这是我去年选修python程序设计时候的作业五,当时是皇甫伟老师教的然后范茜莹姐姐当的助教还代了两节课(虽然我作为颜狗沉迷颜值没好好听就是了),但是,python程序设计还是值得我来安利的,大二计通贝壳er都去选!!!
前文链接:
- python程序设计之turtle绘图
- Python程序设计之词频统计
- Python程序设计之数字华容道
- Python程序设计之照片墙
目录
作业要求
设计思路
心得体会
作业要求
列出你打算送出的同学好友姓名清单(10位以上),存在Excel、CSV或Text文件中,准备一些装饰图片,以批处理的方式对每位同学完成下述任务:
(1)同学的姓名嵌入在每句中,首字、末字、中间均可。其他的首末字不限。若是确实没有这样的句子,可以用同音或近音字代替。
(2)可以是五言、七言,也可以是混合的形式。尽量考虑韵脚押韵。
(3)完成备注,注明每句诗的来源(作者、篇名)。
(4)完成一封贺卡,在贺卡上按照邮件(或明信片)通用格式排版,包括收信人姓名,内容(诗)、备注、配图、发信人姓名等。
注意所嵌入的姓名字用不同字体或不同颜色表示,且不能对全部同学都使用一张配图。
(5)读取姓名清单文件,自动生成一组贺卡,贺卡存储在一个目录下,文件名中含有好友姓名以示区别
(6)诗歌来源任意,建议用《全唐诗》。
设计思路
(1)先将同学好友姓名清单存在txt文件中,并将其读入:
names = []
with open("name.txt", "r",encoding=('utf-8')) as f:
data = f.readlines()
for l in data:
l = l.strip('n') #去掉列表中每一个元素的换行符
names.append(l)
(2)读入全唐诗:
f = open('全唐诗.txt', 'r', encoding='utf-8') # 读入txt文件
lines = f.readlines()
f.close()
(3)构建正则表达式并加入list:
for i in range(4):
estring = name[i]+'[^,。()!?《》:;””]{4}[,。!?]' # 构建诗句的正则表达式
e1 = re.compile(estring)
estring = '【[^】]*】' # 创建诗名的正则表达式
e2 = re.compile(estring)
poem_name = ""
find_result = []
# 根据正则表达式寻找结果并加入list
for line in lines:
line = line.replace(u'u3000', u' ')
if(e2.findall(line) != []):
poem_name = line[line.find('【'):line.rfind("\")]
if(e1.findall(line) != []):
result = [poem_name, e1.findall(line)[0]]
find_result.append(result)
result = random.choice(find_result) # 利用random函数挑选结果
(4)draw函数进行贺卡绘制:
for name in names_dict:
num=random.randint(1,5) # 使用random函数挑选背景图片
img = Image.open('background/'+str(num)+'.tif')
img=img.resize((1000,800)) # resize函数调整背景图片大小
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(font='AZhuPaoPaoTi-2.ttf', size=36)
# 信头部分
draw.text(xy=(100,150),text="亲爱的",fill=(0,0,0),font=font)
draw.text(xy=(208,150),text=name[1:],fill=(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font)
draw.text(xy=(300,150),text=":",fill=(0,0,0),font=font)
draw.text(xy=(172,200),text="为您写了首诗,希望您喜欢:",fill=(0,0,0),font=font)
# 诗的部分
i=0
for si in names_dict[name]:
draw.text(xy=(172,250+i*50),text=si[1][0],fill=(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font)
draw.text(xy=(208, 250+i*50), text=si[1][1:], fill=(0, 0, 0), font=font)
i=i+1
# 信尾部分
draw.text(xy=(172,500),text="此致",fill=(0,0,0),font=font)
draw.text(xy=(100,550),text="敬礼!",fill=(0,0,0),font=font)
draw.text(xy=(550,650),text="李尧",fill=(0,0,0),font=font)
draw.text(xy=(550,700),text="2021/6/27",fill=(0,0,0),font=font)
# 保存图片
file_path="card/"+name+".jpg"
img.save(file_path)
二、运行结果
心得体会
在调试过程中,整体上比较顺利,中间遇到了几个问题总结以下:
- 依旧是正则表达式带来了些许困难,但在同学的帮助下,也算是完成了正则表达式的编写;
- 文件编码格式的小问题,网上下载的全唐诗是ANSI编码的,要将其另存为UTF-8的格式才能用python打开;
- 作业过程中会报IndexError: list index out of range的错误,通过上网查询得知是list的长度出了问题,做了定长之后就成功实现了功能。



