Python基础教程——把文本转为HTML格式

时间:2022-02-24 18:40:01

功能:将文本文件转换成html格式的文档。
方法:
1.添加初始标签
2.智能分段

#util.py
def lines(file):
#遍历文本文件,用生成器保存每行
for line in file:yield line #此时获取到第一行的值后,会暂停,返回到被调用的地方,即blocks函数语句中
#在文件最后添加空行
yield '\n'

def blocks(file):
block=[]
#lines函数返回的yield存储值,拿来每行遍历,根据是否有空行找出段落
for line in lines(file):
#判断是否为字符串,字符串才有split()方法,如果有,追加到block里,开始回到lines中进入到下一次循环,
if line.strip():
block.append(line)
#如果不是字符串,那么将block里的内容去空格并追加到空字符串''后,然后清空block,避免重复内容
elif block:
yield ''.join(block).strip()
block=[]

#simple_markup.py
import sys,re
from util import *

print '...'
title=True

for block in blocks(sys.stdin):
block=re.sub(r'\*(.+?)\*',r'<em>\1</em>',block)
if title:
print '<h1>'
print block
print '</h1>'
title=False
else:
print '<p>'
print block
print '</p>'
print ''

数据流是这样的:
python simple_markup.py f1output.html
回车运行,首先打印初始标签,然后进入for循环,调用到util.py里面的blocks函数,blocks函数中的循环调用到lines函数,生成一个新的文本文件(其实就是最后面加了一个空行),然而在用到yield生成器的过程中非常有意思:

首先在lines里面遍历原始文件的每行,每遍历一行后,会暂停并将值返回给blocks函数,blocks收到后进入if判断,是字符串,则追加到空列表中。否则将其字符串化”.join(block).strip()

第一次循环之后,程序回到lines函数暂停的地方,就是util.py第4行,继续遍历原始文件,从第二行开始。当遇到空行,返回值将是空,那就会进入到elif判断中,将blocks列表里的内容字符串化,并回到simple_markup.py中去。

进入simple_markup.py的循环中之后,如果原始文件还没读完,会再回去进行下一次循环,直到全部完成,最后一次循环是:yield \n添加空行返回给blocks,由于为空,进入elif,将内容结算后,清空再次循环,再次进入到elif 判定为false不再继续,程序结束。

涉及的知识点:
1.sys.stdin
2.生成器yield
3.正则表达式的过滤

sys.stdin 标准输入,手册里没多讲,在使用使用时作为参数运行,python simple_markup.pyfilename2,读filename1的内容写入,输出到filename2中

生成器参考这篇,写的太好了!

正则表达式,这里用到的re.sub(r’”(.*?)”‘,r’\1‘,block)

代表将block的内容里面“”之内的内容转换为加上标签的形式。\1(数字1)代表反向引用,稍后详解。

值返回给simple_markup.py中的循环判断,第一行的值作为首行
其余的为段落,最后打印结尾标签。

转载地址: