代码改变世界

第一个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页的打印结果看看哪里开始出现偏差,发现了换页清零的时候,有时候会出现跨页的行,修改了一下判断。完成。