




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Linux系統(tǒng)自動化運維(Python版)(微課版)工業(yè)和信息化精品系列教材項目3
處理文件內(nèi)容與配置文件人民郵電出版社能力CAPACITY要求了解文件內(nèi)容處理,學(xué)會文件內(nèi)容處理的Python編程。了解配置文件的常用格式,掌握配置文件操作的Python編程。了解模板,學(xué)會使用Jinja2模板編程處理文本文件。學(xué)會使用內(nèi)置模塊編程比對文件和目錄內(nèi)容。任務(wù)3.2操作配置文件任務(wù)3.1解析和處理文件內(nèi)容任務(wù)3.3使用模板高效處理文本文件任務(wù)3.4比對文件和目錄內(nèi)容任務(wù)3.1解析和處理文件內(nèi)容任務(wù)說明01OPTION02OPTION03OPTION了解字符串操作方法了解文本文件的讀寫方法掌握編碼和解碼的基本知識和實現(xiàn)方法04OPTION05OPTION掌握正則表達式的使用方法學(xué)會編程解析和處理文件內(nèi)容任務(wù)3.1解析和處理文件內(nèi)容相關(guān)知識3.1.1字符串及其操作字符串的形式字符串運算符字符串格式化Python內(nèi)置的字符串函數(shù)任務(wù)3.1解析和處理文件內(nèi)容相關(guān)知識3.1.2文本文件的讀寫文件操作的基本流程(1)打開文件(2)對打開的文件進行操作(3)關(guān)閉文件文本文件的讀取read():一次性讀取全部文件內(nèi)容readline():每次讀取一行的內(nèi)容,包括末尾的換行符(\n)readlines():一次性讀取全部內(nèi)容,以列表形式返回結(jié)果。文本文件的寫入write():將字符串寫入文件中,返回的是寫入的字符串長度。writelines():將一個字符串列表寫入文件任務(wù)3.1解析和處理文件內(nèi)容相關(guān)知識3.1.3編碼和解碼編碼標準ASCIIUTF-8GBKPython腳本文件的編碼格式Python3編碼默認使用的是UTF-8使用PyCharm創(chuàng)建腳本文件默認采用UTF-8格式編碼任務(wù)3.1解析和處理文件內(nèi)容相關(guān)知識3.1.3編碼和解碼讀寫文本文件的編碼格式在Linux系統(tǒng)中使用Python打開文本文件時,默認編碼是UTF-8在Windows系統(tǒng)中文版中使用Python打開文本文件時,默認編碼是GBKfile=open('文本文件','r',encoding='utf-8')字符串編碼轉(zhuǎn)換編碼使用字符串對象的encode()方法實現(xiàn)encode(encoding='UTF-8',errors='strict’)解碼使用字節(jié)碼對象的decode()方法實現(xiàn)bytes.decode(encoding='utf-8',errors='strict')任務(wù)3.1解析和處理文件內(nèi)容相關(guān)知識3.1.4正則表達式正則表達式的構(gòu)成普通字符元字符正則表達式類型基本正則表達式(BasicRegularExpression,BRE)擴展正則表達式(ExtendedRegularExpression,ERE)Perl正則表達式(PerlRegularExpression,PRE)任務(wù)3.1解析和處理文件內(nèi)容相關(guān)知識3.1.4正則表達式使用內(nèi)置的re模塊處理正則表達式匹配方法——findall()
re.findall(pattern,string,flags=0)替換方法——sub()
re.sub(pattern,repl,string,count=0,flags=0)分割方法——split()re.split(pattern,string[,maxsplit=0,flags=0])編譯正則表達式的方法re模塊提供compile()方法來編譯正則表達式,生成一個正則表達式對象供findall()、match()、search()等方法使用任務(wù)3.1解析和處理文件內(nèi)容任務(wù)實現(xiàn)任務(wù)3.1.1統(tǒng)計用戶賬戶withopen("/etc/passwd",mode="r")asf:#打開/etc/passwd文件
counts={"system":0,"regular":0} #計數(shù)用字典
regulars=[] #普通用戶列表
foriteminf:li=item.strip().split(":") #將讀取的每行數(shù)據(jù)去除換行符再分割為列表
user=dict( #使用字典保存用戶賬戶的主要信息
name=li[0],uid=li[2],gid=li[3],home=li[5],shell=li[6])uid=int(user["uid"])#通過UID判斷系統(tǒng)用戶和普通用戶
ifuidinrange(1000)oruid==65534:counts["system"]+=1elifuid>=1000:counts["regular"]+=1regulars.append(user)任務(wù)3.1解析和處理文件內(nèi)容任務(wù)實現(xiàn)任務(wù)3.1.1統(tǒng)計用戶賬戶print("系統(tǒng)用戶數(shù):",counts["system"])print("普通用戶數(shù):",counts["regular"])print("普通用戶列表")print("-"*80)#格式化輸出用戶列表print(format("用戶名","<20"),format("UID","^6"),format("GID","^6"),format("主目錄","<20"),format("Shell","<30"))foruserinregulars:print(format(user["name"],"<20"),format(user["uid"],">6"),format(user["gid"],">6"),format(user["home"],"<20"),format(user["shell"],"<30"))任務(wù)3.1解析和處理文件內(nèi)容任務(wù)實現(xiàn)任務(wù)3.1.2查看配置文件并去除注釋和空行importsysimportosimportre#編譯正則表達式生成一個正則表達式對象,其模式為匹配以“#”或“;”開頭的注釋,或者空行re_obj=pile('^#|^;|^$')arg=sys.argv #獲取Python腳本參數(shù)iflen(arg)>1:del(arg[0]) #刪除第一個參數(shù),即腳本文件本身else:print("請通過參數(shù)提供文件!")exit()任務(wù)3.1解析和處理文件內(nèi)容任務(wù)實現(xiàn)任務(wù)3.1.2查看配置文件并去除注釋和空行forfile_pathinarg:ifos.path.isfile(file_path):#判斷由參數(shù)提供的文件是否存在
withopen(file_path,mode="r")asf:#打開配置文件
print(file_path,"文件內(nèi)容:")print("-"*60)forlineinf.readlines():iflen(re.findall(re_obj,line))>0:#匹配的注釋或空行不顯示
continueelse:print(line.strip())print("-"*60)else:print(file_path,"文件不存在!")任務(wù)3.1解析和處理文件內(nèi)容任務(wù)實現(xiàn)任務(wù)3.1.2查看配置文件并去除注釋和空行編輯運行配置任務(wù)3.2操作配置文件任務(wù)3.1解析和處理文件內(nèi)容任務(wù)3.3使用模板高效處理文本文件任務(wù)3.4比對文件和目錄內(nèi)容任務(wù)3.2操作配置文件任務(wù)說明01OPTION02OPTION03OPTION了解INI文件格式并掌握操作INI文件的編程方法了解XML文件格式并掌握操作XML文件的編程方法了解JSON文件格式并掌握操作JSON文件的編程方法04OPTION了解YAML文件格式并掌握操作YAML文件的編程方法任務(wù)3.2操作配置文件相關(guān)知識3.2.1INI文件及其Python操作方法INI文件格式[Global]id=canonicalversion=1.0about=MozillaFirefoxforUbuntu[Preferences]app.distributor="canonical"app.distributor.channel="ubuntu"app.partner.ubuntu="ubuntu"mozilla.partner.id="ubuntu"任務(wù)3.2操作配置文件相關(guān)知識3.2.1INI文件及其Python操作方法configparser模塊創(chuàng)建ConfigParser對象importconfigparserconfig=configparser.ConfigParser()讀取INI文件:config.read("INI文件")使用sections()方法獲取所有的節(jié)。使用options("節(jié)")方法獲取指定節(jié)下所有的選項。使用items("節(jié)")方法獲取指定節(jié)的所有選項任務(wù)3.2操作配置文件相關(guān)知識3.2.2XML文件及其Python解析方法XML文件格式<?xmlversion="1.0"encoding="UTF-8"?><!--這一個測試文件--><configurationpurpose="test"><type>Storage</type><ver>1.0</ver><mem>16G</mem><disk><hdno="01"><type>ssd</type><capacity>1000M</capacity></hd><hdno="02"><type>hhd</type><capacity>2000M</capacity></disk></configuration>任務(wù)3.2操作配置文件相關(guān)知識3.2.2XML文件及其Python解析方法XML的解析方式通過文檔模型解析,需在預(yù)先知道文檔結(jié)構(gòu)的情況下使用。遍歷節(jié)點,包括遍歷文檔和子節(jié)點。任務(wù)3.2操作配置文件相關(guān)知識3.2.2XML文件及其Python解析方法3種XML解析方法SAX(SimpleAPIforXML)DOM(DocumentObjectModel)ElementTree內(nèi)置minidom模塊提供DOM解析器一次性讀取整個XML文件在內(nèi)存中將其解析成“一棵樹”通過對“樹”的操作來操作XML文件內(nèi)容任務(wù)3.2操作配置文件相關(guān)知識3.2.3JSON文件及其Python操作方法JSON文件格式{"registry-mirrors":["",""],"insecure-registries":["4:5000"],"max-concurrent-downloads":10,"log-opts":{"cache-disabled":false,"cache-compress":true,"max-file":5,"max-size":"10m"}}任務(wù)3.2操作配置文件相關(guān)知識3.2.3JSON文件及其Python操作方法json模塊dumps():對數(shù)據(jù)進行JSON編碼。
loads():對數(shù)據(jù)進行JSON解碼。dump():將Python中的數(shù)據(jù)序列化。load():將JSON字符串反序列化為Python對象。任務(wù)3.2操作配置文件相關(guān)知識3.2.4YAML文件及其Python操作方法YAML文件格式network:#網(wǎng)絡(luò)配置
version:2renderer:networkdethernets:enp3s0:addresses:-/24nameservers:search:[mydomain,otherdomain]addresses:[,]routes:-to:defaultvia:任務(wù)3.2操作配置文件相關(guān)知識3.2.4YAML文件及其Python操作方法PyYAML庫安裝pipinstallpyyaml基本用法safe_load():將YAML文件轉(zhuǎn)換為Python對象dump():將Python對象導(dǎo)出為一個YAML文件任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.1編程操作INI文件讀取INI文件importconfigparserconfig=configparser.ConfigParser()#實例化ConfigParser類config.read("example1.ini")#讀取配置文件print("讀取所有選項值:")#遍歷整個字典forsectioninconfig.sections():#首先讀取節(jié)
print(f"節(jié):[{section}]")forkeyinconfig[section]:#讀取每個節(jié)的選項和值
print(f"選項:{key},值:{config[section][key]}")#輸出選項和值print("讀取個別選項值:")#從字典中讀取指定元素print(f"版本:{config['Global']['version']}")print(f"發(fā)行商:{config['Preferences']['app.distributor']}")任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.1編程操作INI文件修改INI文件importconfigparserconfig=configparser.ConfigParser() #實例化ConfigParser類config["Default"]={ #以字典形式提供一組選項和值
"OS":"Ubuntu","purpose":"develop",}config["res"]={"cpu":"3.2GHz","mem":"16G","disk":"2500G",}config["Net"]={"Servername":"srv001"}#設(shè)置個別選項值config["Net"]["ip"]="1"config["Net"]["firewall"]="no"withopen("example2.ini","w")asconfigfile:#將選項和值寫入INI文件
config.write(configfile)withopen("example2.ini","r")asf:#讀取INI文件,驗證寫入操作是否正確
print(f.read())任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.2使用DOM方法讀寫XML文件讀取XML文件fromxml.domimportminidomdoc=minidom.parse("example1.xml") #讀取XML文件獲取Document對象root=doc.documentElement #獲取DOM根節(jié)點print("配置清單")print("用途:",root.getAttribute("purpose")) #獲取根節(jié)點的屬性值type=root.getElementsByTagName("type")[0] #獲取根節(jié)點下面第1個type節(jié)點print("類別:",type.firstChild.data) #獲取type節(jié)點的文件內(nèi)容┈┈disks=root.getElementsByTagName("disk") #獲取根節(jié)點disk的節(jié)點集合hds=disks[0].getElementsByTagName("hd") #獲取disk節(jié)點下的hd子節(jié)點集合print("硬盤數(shù)量:",len(hds))forhdinhds: #遍歷hd子節(jié)點集合
no=hd.getAttribute("no") #獲取hd子節(jié)點的no屬性值
type=hd.getElementsByTagName("type")[0] #獲取hd子節(jié)點的type節(jié)點
cp=hd.getElementsByTagName("capacity")[0] #獲取hd子節(jié)點的capacity節(jié)點
print("編號:%s,類型:%s,容量:%s"%(no,type.firstChild.data,cp.firstChild.data))任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.2使用DOM方法讀寫XML文件修改XML文件fromxml.domimportminidomdoc=minidom.parse("example1.xml")#讀取XML文件生成DOM樹root=doc.documentElement#獲取根節(jié)點┈┈#在disk節(jié)點下添加一個hd子節(jié)點disk=root.getElementsByTagName("disk")[0]hd=doc.createElement("hd")hd.setAttribute("no","004")type=doc.createElement("type")type.appendChild(doc.createTextNode("ssd"))cp=doc.createElement('capacity')cp.appendChild(doc.createTextNode("500M"))hd.appendChild(type)hd.appendChild(cp)disk.appendChild(hd)#使用writexml()方法將修改后的DOM樹寫入文件withopen('example2.xml','w',encoding='utf-8')asf:doc.writexml(f,addindent='',encoding='utf-8')任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.3編程操作JSON文件讀取JSON文件并進行解析importjsonwithopen("example1.json",'r',encoding='utf-8')asf:dic=json.load(f) #將從JSON文件中讀取的數(shù)據(jù)傳給字典變量mirror=dic['registry-mirrors'] #從字典中解析數(shù)據(jù)print("鏡像加速地址:",";".join(str(i)foriinmirror))#解析JSON數(shù)組print("私有注冊中心的地址:",";".join(str(i)foriindic['insecure-registries']))print("下載最大并發(fā)數(shù):",dic['max-concurrent-downloads'])subdic=dic['log-opts']#使用字典嵌套解析JSON對象嵌套print("日志選項:")print("禁用緩存:","是"ifsubdic['cache-disabled']else"否")print("壓縮緩存:","是"ifsubdic['cache-compress']else"否")print("文件最大數(shù):",subdic['max-file'])print("文件最大容量:",subdic['max-size'])任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.3編程操作JSON文件修改JSON文件importjsonwithopen("example1.json",'r',encoding='utf-8')asf:dic=json.load(f) #將從JSON文件中讀取的數(shù)據(jù)傳給字典變量reg=dic['insecure-registries'] #解析insecure-registries的值得到一個列表reg.append("2:5000") #向該列表中添加數(shù)據(jù)dic['insecure-registries']=reg #修改insecure-registries的值dic['max-concurrent-downloads']=15 #值為數(shù)值,可直接修改log_subdic=dic['log-opts'] #使用字典嵌套解析JSON對象嵌套log_subdic["cache-max-file"]=5log_subdic["cache-max-size"]="20m"dic['log-opts']=log_subdicwithopen("example2.json",'w',encoding='utf-8')asf:json.dump(dic,f,indent=4,ensure_ascii=False)#寫入JSON文件withopen("example2.json","r")asf: #讀取新文件驗證上述修改是否正確
print(f.read())任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.4編程操作YAML文件讀取YAML文件并進行解析importyamlwithopen("example1.yaml","r",encoding="utf-8")asf:data=yaml.safe_load(f)#獲取YAML文件數(shù)據(jù)network=data['network']#解析字典中的network鍵值print("版本:",network["version"])#解析network鍵值中嵌套的字典print("渲染:",network["renderer"])print("以太網(wǎng)配置:")ethernets=network["ethernets"]fornic_name,nic_confinethernets.items():#遍歷ethernets字典
print("網(wǎng)卡:"+nic_name)print("IP地址:",";".join(str(ip)foripinnic_conf["addresses"]))#列表
print("名稱服務(wù)器:")print("名稱搜索:",";".join(str(s)forsinnic_conf["nameservers"]["search"]))print("IP地址:",";".join(str(a)forainnic_conf["nameservers"]["addresses"]))print("路由")forrouteinnic_conf["routes"]:#路由列表
print("目的:",route["to"])#嵌套字典
print("經(jīng)由:",route["via"])任務(wù)3.2操作配置文件任務(wù)實現(xiàn)任務(wù)3.2.4編程操作YAML文件修改YAML文件importyamlwithopen("example1.yaml","r",encoding="utf-8")asf:data=yaml.safe_load(f) #獲取YAML文件數(shù)據(jù)network=data['network'] #解析字典中的network鍵值network["version"]=3 #修改network字典中的version鍵值ethernets=network["ethernets"]#修改嵌套的字典中的鍵值,在下面添加兩個IP地址ethernets["enp3s0"]["addresses"].extend(("/24","/24"))withopen("example2.yaml","w",encoding="utf-8")asf:yaml.dump(data,f) #寫入YAML文件withopen("example2.yaml","r",encoding="utf-8")asf:print(yaml.safe_load(f)) #讀取新文件驗證上述修改是否正確任務(wù)3.2操作配置文件任務(wù)3.1解析和處理文件內(nèi)容任務(wù)3.3使用模板高效處理文本文件任務(wù)3.4比對文件和目錄內(nèi)容任務(wù)3.3使用模板高效處理文本文件任務(wù)說明01OPTION02OPTION03OPTION了解Jinja2模板及其用法學(xué)會使用Jinja2模板生成HTML文件學(xué)會使用Jinja2模板生成XML配置文件任務(wù)3.3使用模板高效處理文本文件相關(guān)知識3.3.1什么是模板模板是一個包含響應(yīng)文本的文件,其中特殊的占位變量表示動態(tài)變換的部分。模板通常在Web開發(fā)中使用,以便有效地將業(yè)務(wù)邏輯和頁面邏輯分隔。Python標準庫提供的Template模板僅支持簡單的模板功能。Jinja2模板具有靈活、快速、安全等特點。安裝Jinja2模板pipinstalljinja2任務(wù)3.3使用模板高效處理文本文件相關(guān)知識3.3.2Jinja2模板語法注釋{#注釋內(nèi)容#}變量{{變量}}占位符表示一個變量,該位置的值將在渲染模板時獲取。過濾器過濾器相當于模板的內(nèi)置函數(shù)和字符串處理函數(shù),用于對變量進行修改。控制結(jié)構(gòu)控制結(jié)構(gòu)使用{%控制語句%}占位符,分為條件語句和循環(huán)語句。宏的定義和調(diào)用宏與編程語言中的函數(shù)類似,用于將行為抽象成可重復(fù)調(diào)用的代碼塊。任務(wù)3.3使用模板高效處理文本文件相關(guān)知識3.3.3Jinja2模板的渲染使用PackageLoader從Python程序的包中讀取并加載模板傳入render()方法的變量可以有多個使用FileSystemLoaderimportosimportjinja2defrender(tpl_path,**kwargs):path,filename=os.path.split(tpl_path)returnjinja2.Environment(loader=jinja2.FileSystemLoader(pathor'./')).get_template(filename).render(**kwargs)任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.1使用Jinja2模板生成HTML文件編寫模板文件<html><head><title>監(jiān)控信息</title><h2>{{host_name}}主機系統(tǒng)信息</h2><h3>采集時間:{{test_time}}</h3><body><tablewidth=400border="1"><tr><td>CPU數(shù)量</td><td>{{cpu_count}}</td></tr><tr><td>CPU使用率</td><td>{{cpu_percent}}%</td></tr><tr><td>內(nèi)存總量</td><td>{{mem_total}}</td></tr><tr><td>已用內(nèi)存</td><td>{{mem_used}}</td></tr>┈┈<tr><td>磁盤寫入數(shù)據(jù)</td><td>{{disk_write}}</td></tr><tr><td>網(wǎng)卡發(fā)送數(shù)據(jù)</td><td>{{net_sent}}</td></tr><tr><td>網(wǎng)卡接收數(shù)據(jù)</td><td>{{net_recv}}</td></tr></table></body></html>任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.1使用Jinja2模板生成HTML文件編寫程序importosimportsocketimportjinja2fromdatetimeimportdatetime#導(dǎo)入sysinfo_bypsutil模塊fromsysinfo_bypsutilimportgather_monitor_data'''定義使用文件系統(tǒng)加載器的模板渲染函數(shù)'''defrender(tpl_path,**kwargs):#此處代碼參見相關(guān)知識3.3.3節(jié)任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.1使用Jinja2模板生成HTML文件編寫程序if__name__=='__main__':host_name=socket.gethostname() #獲取主機名
test_time=datetime.now().strftime("%Y-%m-%d%H:%M:%S") #獲取當前時間
data=gather_monitor_data() #獲取系統(tǒng)信息
data.update(dict(host_name=host_name))data.update(dict(test_time=test_time))html_content=render('rpt_tmpl.html',**data) #渲染模板
file_name="sysinfo-"+test_time+".html" #HTML文件名
withopen(file_name,'w',encoding='utf-8')asf:f.write(html_content)任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.1使用Jinja2模板生成HTML文件測試任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.2使用Jinja2模板生成XML文件編寫用于生成XML文件的模板文件<?xmlversion="1.0"?><network><version>{{version}}</version><renderer>{{renderer}}</renderer><ethernets>{%fornic_name,nic_confinethernets.items()%}<{{nic_name}}><addressestype="array">{%foripinnic_conf['addresses']%}<value>{{ip}}</value>{%endfor%}</addresses>
任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.2使用Jinja2模板生成XML文件編寫用于生成XML文件的模板文件<nameservers><searchtype="array">{%fordomaininnic_conf['nameservers']['search']%}<value>{{domain}}</value>{%endfor%}</search>><addressestype="array">{%foraddrinnic_conf['nameservers']['addresses']%}<value>{{addr}}</value>{%endfor%}</addresses></nameservers></{{key}}>{%endfor%}</ethernets></network>任務(wù)3.3使用模板高效處理文本文件任務(wù)實現(xiàn)任務(wù)3.3.2使用Jinja2模板生成XML文件編寫XML文件生成程序importosfromyamlimportsafe_loadimportjinja2'''讀取YMAL文件的數(shù)據(jù),并轉(zhuǎn)換成字典'''defget_data_from_yaml(filename):withopen(filename,'r')asf:content=f.read()data=safe_load(content)returndata'''定義使用文件系統(tǒng)加載器的模板渲染函數(shù)'''defrender(tpl_path,**kwargs):#此處代碼參見相關(guān)知識3.3.3節(jié)if__name__=='__main__':data=get_data_from_yaml('example1.yaml') #讀取YMAL數(shù)據(jù)
data=data['network'] #讀取network的值
xml_content=render('net_tmpl.xml',**data) #渲染模板
withopen('net_config.xml','w')asf:f.write(xml_content)任務(wù)3.2操作配置文件任務(wù)3.1解析和處理文件內(nèi)容任務(wù)3.3使用模板高效處理文本文件任務(wù)3.4比對文件和目錄內(nèi)容任務(wù)3.4比對文件和目錄內(nèi)容任務(wù)說明01OPTION02OPTION03OPTION了解difflib模塊及其用法了解filecmp模塊及其用法基于difflib模塊編程實現(xiàn)文件內(nèi)容的比對04OPTION基于filecmp模塊編程實現(xiàn)目錄內(nèi)容的比對任務(wù)3.4比對文件和目錄內(nèi)容相關(guān)知識3.4.1difflib模塊difflib模塊SequenceMatcher類用于比較任意類型的兩個序列Differ類用于比較兩個文本行列表HtmlDiff類可生成HTML格式的比較結(jié)果HtmlDiff類用法(1)將HtmlDiff類實例化(2)調(diào)用make_file()方法對兩個文件進行比較(3)調(diào)用open()函數(shù)將比較結(jié)果寫入結(jié)果文件任務(wù)3.4比對文件和目錄內(nèi)容相關(guān)知識3.4.2filecmp模塊比較兩個文件filecmp.cmp(f1,f2,shallow=True)比較兩個目錄中的多個文件filecmp.cmpfiles(dir1,dir2,common,shallow=True)比較兩個目錄filecmp.dircmp(a,b,ignore=None,hide=None)任務(wù)3.4比對文件和目錄內(nèi)容任務(wù)實現(xiàn)任務(wù)3.4.1使用difflib模塊編程比較兩個文件內(nèi)容importsysimportdifflib#從命令行參數(shù)中獲取要比較的文件路徑'''讀取整個文件,自動生成逐行分隔的字符串列表'''defreadfile(file
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保密技術(shù)交流與合作合同
- 跨境電商車輛進口擔保合同范本
- 車輛抵押貸款合同變更及補充協(xié)議書
- 培訓(xùn)中心兼職舞蹈老師聘用合同書(3篇)
- 初三畢業(yè)典禮演講稿(13篇)
- 2024年青海省三江源國家公園管理局下屬事業(yè)單位真題
- 企業(yè)正規(guī)聘用合同(7篇)
- 蘆山縣教育局招聘公費師范畢業(yè)生考試真題2024
- 低壓運維練習(xí)試題附答案
- 鍋爐練習(xí)試題附答案
- 2025年小學(xué)一年級奧林匹克數(shù)學(xué)競賽訓(xùn)練考試題(附答案解析)
- 2025年寧夏銀川市中考物理一模試卷(含解析)
- 2025年初中學(xué)業(yè)水平考試地理模擬試卷(核心素養(yǎng)與能源地理)
- 玻璃瓶合同協(xié)議
- 云南郵政面試題及答案
- 國開2024《人文英語4》邊學(xué)邊練參考答案
- 新版水利工程監(jiān)理日志
- 音樂課堂基礎(chǔ)知識教學(xué)
- 生產(chǎn)月度工作總結(jié)匯報
- 他達拉非臨床應(yīng)用
- 中職高教版(2023)語文職業(yè)模塊-第一單元1.4閃亮的坐標,勞模王進喜【課件】
評論
0/150
提交評論