赞
踩
2021SC@SDUSC
之前分析了三个教学案例APP,现在开始分析网站的搭建,本篇文章主要分析如何用python将文本格式转为html的目录。
目录
由于此项目是一个类似于菜鸟教程的静态教学网站,因此需要先搭建静态网站,再将web网站部署到Docker中,便于他人访问。
项目由多个静态页面组成,为了开发方便,开发者将文本格式的网站结构用python改为html中<ul><li></li></ul>的形式,便于网页的展示。
文本格式的网站结构
Python是面向对象语言,类是一组具有相同属性和行为的对象的抽象,实例是根据类创建的对象。
在Python中,和大多数面向对象语言一样通过class关键字定义类,Python3中类基本都会继承于Object类。类中包括属性和行为(函数)。
在类的内部,使用 def 关键字来定义方法,与一般函数定义不同,类方法必须第一个参数为 self, self 代表的是类的实例(即你还未创建类的实例),其他参数和普通函数是完全一样。
_init_()方法的第一个参数必须是self(self代表类的实例),后续参数可以自由指定。
_init_()函数的用法类似于java中的构造方法,但它不是构造方法,Python中创建实例的方法是_new_() ,这个方法在python中大多数使用默认方法,不需要重新定义。
匿名函数lambda是一类无需定义标识符(函数名)的函数或者子程序,它可以接受仍以多个参数(包括可选参数)并返回单个表达式的值。
lambda [arg1[,arg2,.....argn]] : expression
一个lambda函数,把参数a与参数b相乘并打印结果:
x = lambda a,b:a*b
print(x(5,6))
将文本结构转为html中的目录,开发者使用树结构,定义了TreeNode和Tree两个类。
由数据结构课程中学到的知识我们可知,树结构中的节点保存了指向前一个节点和后一个节点的指针。此项目中,开发者仅保留了指向父节点的指针。
Python中_init_()函数的用法类似于java中的构造方法,但它不是构造方法。_init_()方法的第一个参数必须是self,self表示类的实例。
由代码可知,TreeNode有fatherNode(父节点)、thisNode(本节点)、depth(节点深度)三个属性。
_init_()方法传入参数fatherNode、thisNode、depth,将参数中的fatherNode、thisNode、depth赋值给TreeNode实例的fatherNode、thisNode、depth,完成treeNode实例的初始化。
printinto()函数主要完成打印TreeNode信息的操作。
Tree类的属性有存放TreeNode的数组tree,还包含add()、getall_depth()、findnextall()、hasnext、getmaxdepth()、gettree()、print()函数。
第一个_init_()函数中只有pass语句,pass是空语句,是为了保持结构的完整性,不做任何事情,一般用作占位语句。
第二个函数_init(),传入参数mylist,赋值给Tree类中的tree属性,完成树的初始化操作。
add()函数主要完成将树节点加入树中的操作,传入参数treenode
通过self.tree获取到此实例的tree,再调用数组的append()方法,将新的treenode加入到树中。
getall_depth()获取到传入参数depth深度的所有节点
创建数组sub_free来存放此深度的节点
用for循环遍历tree中的所有节点,判断节点的depth是否等于传入的参数depth,相等的话则调用sub_free.append()函数将此节点加入sub_free数组中。
findnextall()找到所有的子节点
创建新数组sub_tree存放子节点,用for循环遍历此实例中的所有节点,判断节点的父节点是否为传入的参数treenode,是的话则调用sub_tree.append()将此节点加入数组中,这样获得treenode所有子节点。
hasnext()判断参数treenode是否有子节点
创建布尔类型的has并赋值为False,用for循环遍历实例tree中所有节点,判断节点的fatherNode是否为参数treenode,如果是则将布尔值has的值改为True,同时break终止循环。
getmaxdepth()要找到tree的最大深度
为了不破环示例中的树结构,创建temp_tree并将实例的tree赋值给它
调用数组的sort()方法,按照节点的深度由小到大排序。这里用到lambda函数,完成将节点的depth复制给sort()中的key的操作。
最后通过返回排序后数组索引值为-1的数获得最大深度。
文本的目录结构不同层次用tab分离,我们要将每一行的标题提取出来并构造成树结构,可以用到递归方法。
创建Tree实例,来存放文本结构目录的树结构。
定义rescue_me()函数,需要传入参数node、parent、depth。
调用sys模块中的open()函数打开指定文件,root赋值为文件读取的第一行(readline()读取文件的一行,rstrip()删除 string 字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符。)
node赋值为文件的第二行值。
第一次调用rescue_me()函数depth定为1(父节点depth为0,第一次传入的node depth为1)
rescue_me()主要用递归的方法实现目录树结构的构造
用while循环判断是否为空节点
如果不为空节点,首先要判断一下此节点是否为参数depth这一层的节点。计算"\t"的数目,如果"\t"数目与depth相符,则证明这个节点是参数depth这一层的节点(根节点前无"\t",层数为0,第一层节点前有一个"\t",depth为1)。
这一层的节点将传入的参数node与parent中的"\t"替换为”“,获得标题,调用TreeNode()的构造方法,将去除了"\t"的temp_node、temp_parent和depth传入TreeNode()的构造方法中,创建一个TreeNode实例,并调用Tree类中的add()函数将这个新节点加入到上文构造的Tree实例mytree()中。
if语句完成后将parent节点赋值为当前节点node,node赋值为下一个获取到的标题,向下执行。如图:
如果"\t“数目等于depth+1,则证明此节点为下一层节点,那么调用rescue_me(),传入参数node、parent,不同的是要记得传入的depth为这一层depth+1,实现递归。
当递归执行完开始回到之前的断点时,先判断一下此节点是否为空,是空节点则break结束while循环,如果不是检查是否还有下一级,如果"\t"数量与depth相符,同样将节点加入到树中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。