功能:將文字檔案轉換成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裡的內容去空格並追加到空字串''後,然後清空block,避免重複內容
elif block:
yield ''.join(block).strip()
block=
#******_markup.py
import sys,re
from util import *
print '...'
title=true
for block in blocks(sys.stdin):
block=re.sub(r'\*(.+?)\*',r'\1',block)
if title:
print ''
title=false
else:
print ''
print block
print '
'print ''
資料流是這樣的:
python ******_markup.py f1output.html
回車執行,首先列印初始標籤,然後進入for迴圈,呼叫到util.py裡面的blocks函式,blocks函式中的迴圈呼叫到lines函式,生成乙個新的文字檔案(其實就是最後麵加了乙個空行),然而在用到yield生成器的過程中非常有意思:
首先在lines裡面遍歷原始檔案的每行,每遍歷一行後,會暫停並將值返回給blocks函式,blocks收到後進入if判斷,是字串,則追加到空列表中。否則將其字串化」.join(block).strip()
第一次迴圈之後,程式回到lines函式暫停的地方,就是util.py第4行,繼續遍歷原始檔案,從第二行開始。當遇到空行,返回值將是空,那就會進入到elif判斷中,將blocks列表裡的內容字串化,並回到******_markup.py中去。
進入******_markup.py的迴圈中之後,如果原始檔案還沒讀完,會再回去進行下一次迴圈,直到全部完成,最後一次迴圈是:yield \n新增空行返回給blocks,由於為空,進入elif,將內容結算後,清空再次迴圈,再次進入到elif 判定為false不再繼續,程式結束。
涉及的知識點:
1.sys.stdin
2.生成器yield
3.正規表示式的過濾
sys.stdin 標準輸入,手冊裡沒多講,在使用使用時作為引數執行,python ******_markup.pyfilename2,讀filename1的內容寫入,輸出到filename2中
生成器參考這篇,寫的太好了!
正規表示式,這裡用到的re.sub(r』」(.*?)」『,r』\1『,block)
代表將block的內容裡面「」之內的內容轉換為加上標籤的形式。\1(數字1)代表反向引用,稍後詳解。
值返回給******_markup.py中的迴圈判斷,第一行的值作為首行
其餘的為段落,最後列印結尾標籤。
python基礎教程
乙個簡單的客戶機 import socket s socket.socket host socket.gethostname port 1234 s.bind host,port s.listen 5 while true c,addr s.accept print got connection f...
Python基礎教程
本教程不包括python的安裝,ide採用spyder pytho2.7 1.print pow 2,3 8 print 2 3 8這裡pow函式表示乘方,與 功能相同。2.abs 10 10abs函式用來求乙個數的絕對值。3.round 0.6 1.0 round 0.4 0.0round函式將浮...
Python 基礎教程
python由guido van rossum於1989年底發明,第乙個公開發行版發行於1991年。像perl語言一樣,python 源 同樣遵循 gpl gnu general public license 協議。本教程主要針對python 2.x版本的學習,如果你使用的是python 3.x版本...