第一个Python程序
2017-04-20 22:05 明月照花眠 阅读(257) 评论(0) 收藏 举报作者水平有限、交流为主。
需求分析

大概是上个周六,我和上面这位兄弟说,我想要写个小程序练练手。他就给了我这么一个文档。

当时我的感觉就是这个头像还是挺贴切的,来个特写。

开始正题部分,这个问题就是一个简单的文件整理。这个文件每一行的格式是:
编号 墓名&人名&出处。
最后的要求是形成如下的格式:

而且最后人名的排序是要按照笔划数排序,再添加上一个索引,方便查找哪个名字在哪页。
思路分析
先不看源文件,看一下最后要生成的文件。很像Py中的一个数据类型字典。我们就可以判定,最后我们要生成一个字典,然后挨个打印key和value。而key是人名,人名大概有几千个。我们可以创建一个列表来存取人名。在取人名之前再根据笔划对列表中内容进行一次排序。
至于取到这些数据,可以将原来的数据格式化,去前后的空格、编号。以3&和空格为分隔,挨个的取到人名和墓名以及出处。
实战
数据序列化
person = []
res_dic = {}
def make_data_list(filename):
f = open(filename, 'r', encoding="utf-8")
for line in f.readlines():
line = line.strip()
line = line + "。"
line = line.strip('1234567890')
list = line.split('&')
if len(list) >= 2:
person_list = list[1]
if "," in person_list:
person_list1 = person_list.split(",")
else:
person_list1 = person_list.split(" ")
for n in person_list1:
if n == '':
continue
if n not in person:
person.append(n)
res_dic[n] =[]
res_dic[n].append(list[0]+" 出处:"+list[2])
else:
res_dic[n].append(list[0] + " 出处:" + list[2])
if '。' in res_dic[n]:
res_dic[n].remove('。')
首先清理一下前后的空格和第一行的编号,至于加那个。是为了防止以数字为结尾的出处被误删。然后以&为分隔符形成列表。列表的第一项就是墓名,第二项是人名,第三项是出处。
首先取出人名,人名的分隔分为空格和逗号,需要分别进行列表化。然后加入到最后的人名列表中。同时也将这个人名加入字典,进行判断,将墓名和出处加到字典的value中。至此,所有的数据已经成了Python的数据结构中。
进行笔画排序
我是在网上找到了一个汉字库,将2W多个汉字及笔画数和笔画顺序都有。导入到python的字典中。
def make_bihua_zidian():
bihua = {}
f1 = open("bh.txt","r",encoding="utf-8")
for m in f1:
h = m.split()
bihua[h[0]]= len(h[1])
f1.close()
return bihua
将生成的字典笔画作为依据,来进行笔画排序。
def perlist_withbihua(bihua):
person_withnum = []
for n in person:
if n[0] in bihua:
if bihua[n[0]] <10:
h = str(bihua[n[0]])+ '/' + n
else:
h = 's'+ str(bihua[n[0]])+ '/' + n
person_withnum.append(h)
person_withnum.sort()
return person_withnum
这里是在每个人名前面加上一个笔画数,如果超过10画加一个字母做标志。因为笔画最多就20几画,没超过100画。所以就没有进行进一步的判断。
生成文件
def add_dic(str,num,person_withnum):
f2.write(str + ":\n")
for n in person_withnum:
m = n.split("/")
if m[0] == num:
f2.write(" "+ m[1] + ":\n")
for n in res_dic[m[1]]:
n = n.strip('.、.')
n1 = n.split(" ")
str_l = len(n1[0]) * 2
space_count = 30 - str_l
f2.write(" " + n1[0] + "".ljust(space_count) + n1[1] + "\n")
else:
continue
生成文件就是按行取值即可,取值以后看看结果,再进一步优化。
生成索引
bihua = make_bihua_zidian()
hanzilist = [":",",","。","?","“","”","’","‘","、"]
f = open("test",'r',encoding="utf-8")
page_num = 1
line_num = 0
f1 = open("result","w",encoding="utf-8")
for n in f.readlines():
hz_num = 0
if line_num >= 44 :
page_num += 1
#line_num = 0
line_num = line_num - 44
for hz in n:
# if hz in bihua or hz in hanzilist:
if hz in bihua:
hz_num +=1
n_len = len(n) + hz_num
if n_len > 69.5:
line_num +=1
# if n.split(" ").count(" ") >55 and n_len > 66:
# line_num +=1
if n[0] is not " ":
line_num += 1
continue
n = n.strip(" ")
if len(n.split(" ")) > 1:
line_num += 1
continue
n = n[0:-1]
page_num1 = str(page_num)
f1.write(n + " " +page_num1 + "\n")
line_num += 1
page_num1 = int(page_num1)
if 34 < page_num1 < 36 :
print(n,line_num)
整体代码如下。最开始我犯了个失误,将WORD直接复制所有的内容到TXT下。结果在文件里面有很多的不是自然换行,使用回车换行,没有了换行符。我的脚本就没法判断。后来直接读取了doc文档,然后前面的还好,后面的总会差出一页,于是开始10页10页的打印结果看看哪里开始出现偏差,发现了换页清零的时候,有时候会出现跨页的行,修改了一下判断。完成。
浙公网安备 33010602011771号