版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
信息科學(xué)技術(shù)學(xué)院1
實用Python程序設(shè)計文件讀寫信息科學(xué)技術(shù)學(xué)院2文本文件讀寫信息科學(xué)技術(shù)學(xué)院郭煒德國菲森新天鵝堡文本文件讀寫文本文件讀寫概述open函數(shù)打開文件,將返回值放入一個變量,例如f用f.write函數(shù)寫入文件用f.readlines()函數(shù)讀取全部文件內(nèi)容用f.readline()函數(shù)讀取文件一行用f.close()函數(shù)關(guān)閉文件用f.read()讀取全部文件內(nèi)容。返回一個字符串,包含文件全部內(nèi)容4文本文件讀寫創(chuàng)建文件并寫入內(nèi)容a=open("c:\\tmp\\t.txt","w")#文件夾c:\tmp必須事先存在,open不會創(chuàng)建文件夾
#"w"表示寫入,用此種方式打開文件,若文件本來存在,就會被覆蓋a.write("good\n")a.write("好啊\n")a.close()運(yùn)行后文件c:\tmp\t.txt內(nèi)容:good好啊5文本文件讀寫讀取現(xiàn)有文件f=open("c:\\tmp\\t.txt","r")#"r"表示讀取lines=f.readlines()#每一行都帶結(jié)尾的換行符"\n"f.close()#lines是個字符串列表,每個元素是一行forxinlines:print(x,end="")輸出:good好啊6文本文件讀寫讀取現(xiàn)有文件#不用readlines也行f=open("c:\\tmp\\t.txt","r",encoding="utf-8")forxinf:print(x,end="")f.close()7文本文件讀寫用readline讀文件中的一行infile=open("c:\\tmp\\t.txt","r")whileTrue:data1=infile.readline()#data1帶結(jié)尾的換行符"\n"。空行也有一個字符,就是"\n" ifdata1=="":#此條件滿足就代表文件結(jié)束
breakdata1=data1.strip()#去掉兩頭空格,包括結(jié)尾的"\n"print(data1)infile.close()8文本文件讀寫如果要讀取的文件不存在會引發(fā)異常:try:f=open("c:\\tmp\\ts.txt","r")#若文件不存在,會產(chǎn)生異常,跳到except后面執(zhí)行l(wèi)ines=f.readlines()
f.close()forxinlines:print(x,end="")exceptExceptionase:print(e)#>>[Errno2]Nosuchfileordirectory:'c:\\tmp\\ts.txt'9文本文件讀寫添加文件內(nèi)容:f=open("c:\\tmp\\t.txt","a")#"a"要打開文件添加內(nèi)容。若文件本來不存在,就創(chuàng)建文件f.write("新增行\(zhòng)n")f.write("ok\n")f.close()good好啊新增行ok文件打開模式"r":文本文件讀"rb":二進(jìn)制文件讀"w":文本文件寫"wb":二進(jìn)制文件寫"r+":文本文件既讀又寫"rb+":二進(jìn)制文件既讀又寫文本文件的編碼信息科學(xué)技術(shù)學(xué)院郭煒威尼斯文本文件的編碼常見編碼有g(shù)bk和utf-8兩種。打開文件時如果編碼不對,則不能正確讀取文件.ANSI對應(yīng)gbk寫入文件時,如果不指定編碼,則用操作系統(tǒng)的缺省編碼Windows:gbk,可能從win10開始是utf-8Linux,MacOs:utf-8python程序的編碼.py文件必須存成utf-8格式,才能運(yùn)行如果存成ansi格式,則應(yīng)該在文件開頭寫:#coding=gbkprint("你好")文本文件的編碼創(chuàng)建文件和讀取文件時都可以指定編碼outfile=open("c:\\tmp\\t.txt","w",encoding="utf-8")#若打開文件用于寫入時不指定編碼,則使用系統(tǒng)缺省編碼,win10下也可能是Ansi(gbk)outfile.write("這很好ok\n")
outfile.write("這ok")
outfile.close()
infile=open("c:\\tmp\\t.txt","r",encoding="utf-8")
lines=infile.readlines()
infile.close()
forxinlines:
print(x.strip())文本文件的編碼gbk編碼的文件,如果用encoding="utf-8"來open,可能會產(chǎn)生異常。utf-8編碼的文件,如果用encoding="gbk"來open,不會產(chǎn)生異常,但是用read或readline,readlines讀取到的信息會亂碼。信息科學(xué)技術(shù)學(xué)院郭煒文件的路徑瑞士少女峰open文件名參數(shù)的相對路徑形式和絕對路徑形式相對路徑形式:文件名沒有包含盤符open("readme.txt","r")
文件在當(dāng)前文件夾(當(dāng)前路徑)下open("tmp/readme.txt","r") "/"寫成"\\"效果也一樣
文件在當(dāng)前文件夾下的tmp文件夾里面open("tmp/test/readme.txt","r")
文件在當(dāng)前文件夾下的tmp文件夾里面的test文件夾下面open("../readme.txt","r")
文件在當(dāng)前文件夾的上一層文件夾里面open("../../readme.txt","r")
文件在當(dāng)前文件夾的上兩層文件夾里面open("../tmp2/test/readme.txt","r")
文件在當(dāng)前文件夾的上一層的tmp2文件夾的test文件夾里面
tmp2和當(dāng)前文件夾是平級的open("/tmp3/test/readme.txt","r")
文件在當(dāng)前盤符的根文件夾下的tmp3/test/里面open文件名參數(shù)的相對路徑形式和絕對路徑形式絕對路徑形式:文件名包含盤符open("d:/tmp/test/readme.txt","r")路徑也叫文件夾,或者目錄(path,folder,directory)Python程序的“當(dāng)前文件夾(當(dāng)前路徑,當(dāng)前目錄)”程序運(yùn)行時,會有一個“當(dāng)前文件夾”,open打開文件時,如果文件名不是絕對路徑形式,則都是相對于當(dāng)前文件夾的。一般情況下,.py文件所在的文件夾,就是程序運(yùn)行時的當(dāng)前文件夾。在Pycharm里面運(yùn)行程序,就是如此。程序可以獲取當(dāng)前文件夾:importosprint(os.getcwd())
#os.getcdw()獲取當(dāng)前文件夾#>>c:\tmp5\testPython程序的“當(dāng)前文件夾(當(dāng)前路徑,當(dāng)前目錄)”在命令行方式運(yùn)行程序時,cmd窗口的當(dāng)前文件夾,就是程序的當(dāng)前文件夾,不論程序存在哪里。c:\tmp5\test\t1.py如下:importosprint(os.getcwd())
則:命令提示符Python程序的“當(dāng)前文件夾(當(dāng)前路徑,當(dāng)前目錄)”程序運(yùn)行期間可以改變當(dāng)前文件夾c:\tmp5\test\t1.py如下:importosprint(os.getcwd())os.chdir("c:/tmp")print(os.getcwd())則:信息科學(xué)技術(shù)學(xué)院郭煒文件夾操作祁連山Python的文件夾操作函數(shù)os庫和shutil庫中有一些函數(shù)可以用來操作文件和文件夾(文件夾也稱為“目錄”)os.chdir(x)將程序的當(dāng)前文件夾設(shè)置為xos.getcwd()求程序的當(dāng)前文件夾os.listdir(x)返回一個列表,里面是文件夾x中的所有文件和子文件夾的名字os.mkdir(x)創(chuàng)建文件夾xos.path.exists(x)判斷文件或文件夾x是否存在os.path.getsize(x) 獲取文件x的大?。▎挝?字節(jié))os.path.isfile(x)判斷x是不是文件os.remove(x)刪除文件xos.rmdir(x)刪除文件夾x。x必須是空文件夾才能刪除成功os.rename(x,y)將文件或文件夾x改名為y。不但可以改名,還可以起到移動文件或文件夾的作用。例如,os.rename("c:/tmp/a","c:/tmp2/b")可以將文件夾或文件"c:/tmp/a"移動到"c:/tmp2/"文件夾下面,并改名為b。前提是tmp2必須存在。shutil.copyfile(x,y)拷貝文件x到文件y。若y本來就存在,會被覆蓋Python的文件夾操作函數(shù)刪除文件夾的遞歸函數(shù):(不要隨便試,用它刪除了文件夾就不能恢復(fù))importosdefpowerRmDir(path):#連根刪除文件夾pathlst=os.listdir(path) forxinlst:actualFileName=path+"/"+x #x不包括路徑,例如a.txtifos.path.isfile(actualFileName):#actualFileName是文件os.remove(actualFileName)else:powerRmDir(actualFileName)#actualFileName是文件夾os.rmdir(path)powerRmDir("c:/tmp/ttt")powerRmDir("tmp/ttt")#刪除當(dāng)前文件夾下的tmp文件夾下的ttt文件夾Python的文件夾操作函數(shù)獲取文件夾總大小的遞歸函數(shù)importosdefgetTotalSize(path):total=0lst=os.listdir(path)forxinlst:actualFileName=path+"/"+x#x不包括路徑ifos.path.isfile(actualFileName):total+=os.path.getsize(actualFileName)else:total+=getTotalSize(actualFileName)returntotal文件處理實例信息科學(xué)技術(shù)學(xué)院郭煒美國紀(jì)念碑谷程序1:統(tǒng)計文章中的單詞詞頻程序名:countfile.py用命令行方式啟動該程序:pythoncountfile.py對"源文件"進(jìn)行單詞詞頻(出現(xiàn)次數(shù))分析,分析結(jié)果寫入"結(jié)果文件",單詞按照字典序排列28程序1:統(tǒng)計文章中的單詞詞頻文章文件a1.txt的格式:Whenmanycouplesdecidetoexpandtheirfamily,theyoftentakeintoconsiderationthedifferentgenetictraitsthattheymaypassontotheirchildren.Forexample,ifsomeonehasahistoryofheartproblems,theymightbeconcernedaboutpassingthatontotheirchildrenaswell.TreacherCollinssyndrome,orTCS,?isararefacialdisfigurementthatgreatly:slows:thedevelopmentofbonesandothertissuesthatmakeupthehumanface.Asaresult,mostpeopleliving?withTCShave?underdevelopedcheekbones,asmalljaw,andanundersizedchin.29程序1:統(tǒng)計文章中的單詞詞頻統(tǒng)計的結(jié)果結(jié)果文件r1.txt格式a 8about 2an 1and 4are 1around 1as 2backlash 1be 430程序1:統(tǒng)計文章中的單詞詞頻思路:要從源文件中分割出單詞,然后用字典記錄單詞的出現(xiàn)頻率。用文件對象的read函數(shù)讀取全部內(nèi)容到一個字符串,然后分割單詞。31程序2:統(tǒng)計多個文件累計單詞頻率程序名countfiles.py:用法:pythoncountfiles.py對當(dāng)前文件夾(countfiles.py文件所在文件夾)下全部文件名是字母a打頭的.txt文件進(jìn)行詞頻統(tǒng)計,統(tǒng)計的總的結(jié)果寫入"結(jié)果文件"result.txt32程序2:統(tǒng)計多個文件累計單詞頻率思路:要獲得.py
程序所在文件夾下的所有a打頭,.txt結(jié)尾的文件。對每個文件,調(diào)用上面程序1的處理單個文件的函數(shù)進(jìn)行處理importos
#python自帶os
庫os.listdir()可以獲得當(dāng)前文件夾下所有文件和文件夾的列表。列表中元素是文件或文
件夾名字,不帶路徑(目錄)os.path.isfile(x)可以判斷x是不是一個文件(文件夾不是文件)33程序2:統(tǒng)計多個文件累計單詞頻率os.listdir示例假設(shè)c:\tmp文件夾下有文件t.py,
a.txt,b.txt和文件夾hello程序t.py如下:importosprint(os.listdir())則運(yùn)行t.py輸出結(jié)果為:['a.txt','b.txt','hello','t.py']34程序2:統(tǒng)計多個文件累計單詞頻率實現(xiàn):result={}lst=os.listdir()#列出當(dāng)前文件夾下所有文件和文件夾的名字forxinlst:ifos.path.isfile(x):#如果x是文件
ifx.lower().endswith(".txt")andx.lower().startswith("a"):#x是'a'開頭,.txt結(jié)尾
countFile(x,result)#countFile是程序1中統(tǒng)計一個文件的函數(shù)35程序3:準(zhǔn)確統(tǒng)計文章中的單詞詞頻程序名:countfile_novary.py用法:pythoncountfile_novary.py對"源文件"進(jìn)行單詞詞頻分析,分析結(jié)果寫入結(jié)果文件如果碰到單詞的變化形式,則轉(zhuǎn)換成原型再統(tǒng)計單詞原型-變化詞匯表在文件word_varys.txt里面,格式:act
acted|acting|actsaction actionsactive
actively|activeness36程序3:準(zhǔn)確統(tǒng)計文章中的單詞詞頻思路1)同樣需要一個字典來統(tǒng)計單詞及其出現(xiàn)次數(shù)。2)讀取word_varys.txt文件,構(gòu)造一個字典dt。元素形式為:{acted:act,acting:act,acts:act,actions:action,}鍵是單詞的變化形式,值是單詞的原型。3)對每個“源文件”里的單詞w,查找dt中鍵為w的元素x。如果x不存在,則w就是原型,統(tǒng)計其詞頻。如果x存在,則值x[1]是原型,將x[1]的出現(xiàn)次數(shù)加1。37程序4:countfile_nocet4.py程序名:countfile_nocet4.py用法:pythoncountfile_nocet4.py對源文件進(jìn)行單詞詞頻分析,只抽取不在四級單詞列表中的單詞,將分析結(jié)果寫入"結(jié)果文件"四級單詞列表在文件cet4words.txt中,單詞都是單獨(dú)一行,以$打頭$a[e?]art.一(個);每一(個)$abandon[?'b?nd?n]vt.遺棄;放棄;放縱(自己)38程序4:countfile_nocet4.py思路:讀取cet4words.txt中的單詞,存放到一個集合里面。碰到源文件里的單詞,先查查在不在集合里面,如果在,則拋棄。39信息科學(xué)技術(shù)學(xué)院40
實用Python程序設(shè)計Python數(shù)據(jù)庫編程信息科學(xué)技術(shù)學(xué)院郭煒41數(shù)據(jù)庫和SQL信息科學(xué)技術(shù)學(xué)院黃山數(shù)據(jù)庫的概念數(shù)據(jù)庫可以用來存放大量數(shù)據(jù),并且提供了方便的快速檢索手段便于快速找出符合某種條件的數(shù)據(jù)。比如:工作年限超過三年,工資超過10000元的北京籍員工一個數(shù)據(jù)庫可以是一個文件,比如c:/tmp/students.db數(shù)據(jù)庫中的表一個數(shù)據(jù)庫文件里可以有多張表。比如students.db
里包含"學(xué)生信息表"和"課程信息表"表由記錄構(gòu)成,比如“學(xué)生信息表”里的每個記錄,代表一個學(xué)生的信息。記錄由字段構(gòu)成,描述一個事物的多個屬性。比如學(xué)生記錄,可以由name,id,age,gender,gpa
等字段構(gòu)成字段
字段是有"類型"的。比如字段名
數(shù)據(jù)類型name text 字符串gpa real 小數(shù)age integer 整數(shù)profile text photo blob 二進(jìn)制數(shù)據(jù)(如圖片)birthday date 日期(本質(zhì)上就是text)registertime datetime
日期+時間(本質(zhì)上就是text)46SQL數(shù)據(jù)庫查詢語句參考:/sql/sql_syntax.aspSQL命令:用于進(jìn)行數(shù)據(jù)庫操作的標(biāo)準(zhǔn)語句CREATETABLE 創(chuàng)建表INSERTINTO 在表中插入記錄UPDATE 在表中更新記錄SELECT 在表中進(jìn)行查詢DELETE 從表中刪除記錄不區(qū)分大小寫47CREATECREATETABLEifnotexistsstudents(idintegerprimarykey,
nametext,gpareal,birthdaydate,ageinteger,pictureblob)創(chuàng)建了一張名為students的表,有以下字段:字段名
數(shù)據(jù)類型id integer primarykey表示不可重復(fù)name text 字符串gpa real 小數(shù)birthday date 日期(本質(zhì)上就是text)age integer 整數(shù)picture blob 二進(jìn)制數(shù)據(jù)(如圖片)48INSERTINSERTINTOstudentsVALUES(1000,'張三',3.81,'2000-09-12',18,null)在表students中插入一個記錄,該記錄暫無照片(null)VALUES(每個字段的值)創(chuàng)建數(shù)據(jù)庫信息科學(xué)技術(shù)學(xué)院長城入海處:老龍頭創(chuàng)建數(shù)據(jù)庫并寫入數(shù)據(jù)importsqlite3db=sqlite3.connect("c:/tmp/test2.db")#連接數(shù)據(jù)庫,若不存在則自動創(chuàng)建#文件夾c:/tmp必須事先存在,connect不會創(chuàng)建文件夾cur=db.cursor()#獲取光標(biāo),要操作數(shù)據(jù)庫一般要通過光標(biāo)進(jìn)行sql='''CREATETABLEifnotexistsstudents(idintegerprimarykey,nametext,gpareal,birthdaydate,ageinteger,pictureblob)'''#如果表students不存在就創(chuàng)建它c(diǎn)ur.execute(sql)#執(zhí)行SQL命令cur.execute("insertintostudentsvalues(1600,'張三',3.81,'2000-09-12',18,null)")#插入一個記錄mylist=[(1700,'李四',"3.25",'2001-12-01',17,None),(1800,'王五',"3.35",'1999-01-01',19,None)]forsinmylist:#依次插入mylist中的每個記錄cur.execute('INSERTINTOstudentsVALUES(?,?,?,?,?,?)',(s[0],s[1],s[2],s[3],s[4],s[5]))#?對應(yīng)于后面某項mit()#真正寫入,寫入操作都需要這個cur.close()#關(guān)閉光標(biāo)db.close()#關(guān)閉數(shù)據(jù)庫數(shù)據(jù)庫的查詢和修改信息科學(xué)技術(shù)學(xué)院云崗石窟52SELECTSELECT*FROMstudents
檢索students表中全部記錄SELECT*FROMstudentsORDERBYage
檢索students表中全部記錄,并按年齡排序SELECTname,ageFROMstudents檢索students表中全部記錄,但每個記錄只取name和age字段SELECT*FROMstudentsWHEREname='張三'檢索students表中全部name字段為張三的記錄WHERE表示檢索條件SELECT*FROMstudentsWHEREname='張三'ANDage>20ORDERBYage
DESC
檢索students表中全部名為張三且年齡大于20的人,結(jié)果按年齡降序排列檢索數(shù)據(jù)庫importsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql='select*fromstudents'#檢索全部記錄cur.execute(sql)x=cur.fetchone()#fetchone取滿足條件的第一條記錄print(x) #=>(1600,'張三',3.81,'2000-09-12',18,None)print(x[1]) #=>張三forxincur.fetchall():#fetchall取得所有滿足條件的記錄
print(x[:-2])#age和picture字段不打出cur.execute("SELECT*FROMstudentsWHEREname='Jack'")x=cur.fetchone()ifx==None:print("can'tfindJack")cur.close()db.close()(1600,'張三',3.81,'2000-09-12',18,None)張三(1700,'李四',3.25,'2001-12-01')(1800,'王五',3.35,'1999-01-01')can'tfindJack檢索數(shù)據(jù)庫importsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql='selectname,gpa,agefromstudentswheregpa>3.3orderbyagedesc'#查找gpa>3.3的記錄,題取其中三個字段,按年齡降序排列cur.execute(sql)x=cur.fetchall()ifx!=[]:print("total:",len(x))#=>2forrinx:print(r)cur.close()db.close()total:2('王五',3.35,19)('張三',3.81,18)55UPDATEUPDATEstudentsSETgpa=3.9將所有記錄的gpa設(shè)置成3.9
UPDATEstudentsSETgpa=3.9,age=18WHEREname='李四'
修改李四的gpa和年齡56UPDATEimportsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql='UPDATEstudentsSETgpa=?,age=?WHEREname=?'cur.execute(sql,(4.0,20,'李四'))#元組三個元素分別對應(yīng)三個?#修改李四的gpa和年齡。若李四不存在,則無效果mit()#寫入操作必須cur.close()db.close()57DELETEDELETEFROMstudentsWHEREage<18
刪除年齡小于18的記錄
DELETEFROMstudents
刪除全部記錄別忘了最后commit58DROPTABLEDROPTABLEIFEXISTSstudents
刪除students表別忘了最后commit59DROPTABLEimportsqlite3db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()cur.execute("DROPTABLEIFEXISTSstudents")mit()try:cur.execute("select*fromstudents")x=cur.fetchall()forrinx:print(r[:-1])except:print("notable")#=>notablecur.close()db.close()60列出數(shù)據(jù)庫中所有的表和表的結(jié)構(gòu)importsqlite3db=sqlite3.connect("c:/tmp/test3.db")cur=db.cursor()sql='CREATETABLEifnotexiststable2(idinteger,nametext)'cur.execute(sql)#執(zhí)行SQL命令sql='CREATETABLEifnotexiststable1(idinteger,schooktext)'cur.execute(sql)mit()cur.execute('selectnamefromSQLITE_MASTERwheretype="table"orderbyNAME')x=cur.fetchall()ifx!=[]:print(x)cur.execute("PRAGMATABLE_INFO(table1)")print(cur.fetchall())cur.close()db.close()[('table1',),('table2',)][(0,'id','integer',0,None,0),(1,'schook','text',0,None,0)]61注意事項對于修改表的操作,如插入,刪除,更新,關(guān)閉數(shù)據(jù)庫前不要忘了commit,否則
可能無效2.必要時用try...except語句來避免數(shù)據(jù)庫不存在,表不存在時的導(dǎo)致的runtimeerror處理二進(jìn)制字段信息科學(xué)技術(shù)學(xué)院大連金石灘63設(shè)置blob字段(二進(jìn)制字段)的值:importsqlite3importrequestsf=open('c:/tmp/tmp.jpg','rb')#二進(jìn)制方式打開圖片img=f.read()f.close()db=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql="UPDATEstudentsSETpicture=?WHEREname='李四'"cur.execute(sql,(img,))#設(shè)置李四的照片。img對應(yīng)于?64設(shè)置blob字段(二進(jìn)制字段)的值:imgUrl="/uploads/item/201605/19/20160519224441_VfMWR.jpeg"#從網(wǎng)絡(luò)獲取圖片imgStream=requests.get(imgUrl,stream=True)sql="UPDATEstudentsSETpicture=?WHEREname='張三'"cur.execute(sql,(imgStream.content,))#設(shè)置張三的照片。#imgStream.content對應(yīng)于?mit()cur.close()db.close()65讀取blob字段(二進(jìn)制字段)的值:importsqlite3importrequestsdb=sqlite3.connect("c:/tmp/test2.db")cur=db.cursor()sql="selectname,picturefromstudentsWHEREname='張三'orname='李四'"cur.execute(sql)x=cur.fetchall()forrinx:#r[0]是姓名,r[1]是圖片文件數(shù)據(jù)f=open("c:/tmp/"+r[0]+".jpg","wb")#照片寫入張三.jpg和李四.jpgf.write(r[1])f.close()cur.close()db.close()信息科學(xué)技術(shù)學(xué)院66
實用Python程序設(shè)計正則表達(dá)式信息科學(xué)技術(shù)學(xué)院67可以用來判斷某個字符串是否符合某種模式,比如判斷某個字符串是不是郵箱地址,網(wǎng)址,電話號碼,身份證號……可以用來在文本中尋找并抽取符合某種模式的字符串,比如電子郵件地址,電話號碼,網(wǎng)址,身份證號……,找出三國演義中所有孔明提到曹操的場合都說了些啥。正則表達(dá)式正則表達(dá)式的
基本概念和構(gòu)成信息科學(xué)技術(shù)學(xué)院郭煒加拿大班芙國家公園正則表達(dá)式是個某些字符有特殊含義字符串,表示一種字符串的模式(格式),如:"abc" 匹配"abc""b.?p.*k" 匹配"bapk","bpabk"..."\d{3}[a-zA-Z]+.(\d{2}|N/A)\s\1"匹配????可以用相關(guān)函數(shù)求給定字符串和正則表達(dá)式的匹配情況正則表達(dá)式字符/組合匹配的模式正則表達(dá)式匹配的字符串.除'\n'外的任意一個字符,包括漢字(多行匹配方式下也能匹配'\n')'a.b''acb''adb''a(b'*量詞。表示左邊的字符可出現(xiàn)0次或任意多次'a*b''b''ab''aaaab'?量詞。表示左邊的字符必須出現(xiàn)0次或1次'ka?b''kb''kab'+量詞。表示左邊的字符必須出現(xiàn)1次或更多次'ka+b''kab''kaaab'{m}量詞。m是整數(shù)。表示左邊的字符必須且只能出現(xiàn)m次'ka{3}a''kaaaa'{m,n}量詞。m,n是整數(shù)。表示左邊的字符必須出現(xiàn)至少m次,最多n次。n也可以不寫,表示出現(xiàn)次數(shù)沒有上限'ka{1,3}b''kab''kaab''kaaab'正則表達(dá)式中的功能字符字符/組合匹配的模式正則表達(dá)式匹配的字符串\d一個數(shù)字字符,等價于[0-9]'a\db''a2b'a3b'\D一個非數(shù)字的字符,等價于[^\d],[^0-9]'a\Db''acb'\s一個空白字符,如空格,\t,\r,\n等'a\sb''ab''a\nb'\S一個非空白字符'a\Sb''akb'\w一個單詞字符:包括漢字或大小寫英文字母,數(shù)字,下劃線,或其它語言的文字'a\wb'
'a_b''a中b'\W一個不是單詞字符的字符'a\Wb''a?b'|A|B表示能匹配A或能匹配B均算能匹配'ab|c''ab''c'print("\\s\s\S\w\W\d\D")#python字符串中,\s等不是轉(zhuǎn)義字符,都是兩個字符#>>\s\s\S\w\W\d\D正則表達(dá)式中常見的特殊字符有以下幾個:
.+?*$[]()^{}\
如果要在正則表達(dá)式中表示這幾個字符本身,就應(yīng)該在其前面加'\'。正則表達(dá)式中的特殊字符正則表達(dá)式匹配的字符串'a\$b''a$b''a\*b''a*b''a\[\]b''a[]b''a\.*b''ab''a.b''a..b''a\\\\b''a\\b'(注意:此字符串長度為3,中間那個字符是'\',即r'a\b')r'a\\b'r'a\b'(r'a\b'等價于'a\\b')
正則表達(dá)式中的特殊字符print("\*\$\.\+\[\]\(\)\?\^\{\}")#這些都不是轉(zhuǎn)義字符,都是兩個字符#>>\*\$\.\+\[\]\(\)\?\^\{\}范圍符號[]
和
量詞信息科學(xué)技術(shù)學(xué)院郭煒圣彼得堡炮兵博物館范圍符號[XXX]的用法用以表示“此處必須出現(xiàn)一個某某范圍內(nèi)的字符”,或者“此處必須出現(xiàn)一個字符,但不可以是某某范圍內(nèi)的字符”[XXX]的用法[a2c]匹配'a','2','c'之一's[a2c]k''sak''s2k''sck'[a-zA-Z]匹配任一英文字母'b[a-zA-Z]k'
'bak''bUk'[\da-z\?]匹配一個數(shù)字或小寫英文字母或'?''b[\da-z\?]k''b0k''bck''b?k'[^abc]匹配一個非'a','b','c'之一的字符'b[^abc]k'匹配所有能匹配'b.k'的字符串,除了:'bak''bbk''bck'[^a-f0-3]匹配一個非英文字母'a'到'f',也非數(shù)字'0'到'3'的字符略略匹配漢字漢字的unicode編碼范圍是4e00-9fa5(16進(jìn)制),因此[\u4e00-\u9fa5]即表示一個漢字print('\u4e00\u4e01\u4e88\u9fa5') #>>一丁予龥量詞的用法'.+'
匹配任意長度不為0且不含'\n'的字符串。'+'表示左邊的'.'代表的
任意字符出現(xiàn)1次或更多次。不要求出現(xiàn)的字符都必須一樣。'.*'
匹配任意不含'\n'的字符串,包括空串'[\dac]+'
匹配長度不為0的由數(shù)字或'a',c'構(gòu)成的串,如'451a','a21c78ca''\w{5}'
匹配長度為5的由字母或數(shù)字或漢字構(gòu)成的串,如'高大abc', '33我a1'正則表達(dá)式示例[1-9]\d*
正整數(shù)-[1-9]\d*
負(fù)整數(shù)-?[1-9]\d*|0
整數(shù)[1-9]\d*|0
非負(fù)整數(shù)-?([1-9]\d*\.\d*[1-9]|0\.\d*[1-9]|0)
左右都沒有多余0的小數(shù)\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 郵箱郵箱示例:a.b.c.ddef+sfd@正則表達(dá)式的
函數(shù)信息科學(xué)技術(shù)學(xué)院郭煒加拿大班芙國家公園使用正則表達(dá)式使用正則表達(dá)式要:importre82re.match函數(shù)re.match(pattern,string,flags=0)從字符串string的起始位置匹配一個模式patternflags標(biāo)志位,用于控制模式串的匹配方式,如:是否區(qū)分大小寫,多行匹配等等,如re.M|re.I
表示忽略大小寫,且多行匹配成功則返回一個匹配對象,否則返回None83re.match函數(shù)importredefmatch(pattern,string):x=re.match(pattern,string)ifx!=None:print(x.group())#x.group是匹配上的字符串else:print("None")match("ac","acdkgh") #>>acmatch("abc","kabc") #>>None雖然有abc,但不是在起始位置match("a\tb*c","a\tbbcde") #>>a bbcb出現(xiàn)0次或任意多次,然后跟cmatch("ab*c","ac") #>>acmatch("a\d+c","ac") #>>Noneb出現(xiàn)1次或更多次,然后跟cmatch("a\d{2}c","a34c") #>>a34cmatch("a\d{2,}c","a3474884c")#>>a3474884cmatch(".{2}bc","cbcd") #>>Nonebc前面要有2個字符84re.match函數(shù)match(".{2}bc","bcbcdbc") #>>bcbcmatch("ab.*","ab") #>>abb后面可以沒字符或任意字符match("ab.*","abcd") #>>abcdmatch("\d?b.*","1bcd") match("\d?b.*","bbcd") match("a?bc.*","abbbcd") match("a.b.*","abcd") match("a.b.*","aeb") match("a.?b.*","aebcdf") #>>aebcdf#a和b之間沒字符或有任意一個字符均可match("a.+b.*","aegsfb") match("a.+b.*","abc") match("a高.+k","a高大kcd") #>>a高大k85re.match函數(shù)match(".{2}bc","bcbcdbc") #>>bcbcmatch("ab.*","ab") #>>abb后面可以沒字符或任意字符match("ab.*","abcd") #>>abcdmatch("\d?b.*","1bcd") #>>1bcd 數(shù)字應(yīng)出現(xiàn)0次或1次match("\d?b.*","bbcd") #>>bbcdmatch("a?bc.*","abbbcd") #>>None b太多了match("a.b.*","abcd") #>>Nonea和b之間必須要有一個字符match("a.b.*","aeb") #>>aebmatch("a.?b.*","aebcdf") #>>aebcdf#a和b之間沒字符或有任意一個字符均可match("a.+b.*","aegsfb") #>>aegsfbmatch("a.+b.*","abc") #>>Nonematch("a高.+k","a高大kcd") #>>a高大k86re.search函數(shù)87re.search(pattern,string,flags=0)查找字符串中可以匹配成功的子串。若匹配成功,則返回匹配對象;若無法匹配,則返回None。re.search函數(shù)importredefsearch(pattern,string):x=re.search(pattern,string)ifx!=None:print(x.group(),x.span()) #輸出子串及起止位置
else:print("None")search("a.+bc*","dbaegsfbcef") #>>aegsfbc(2,9)search("a.+bc*","bcdbaegsfbccc") #>>aegsfbccc(4,13)search("a.?bc*d","dabccdc") #>>abccd(1,6)search("aa","baaaa") #>>aa(1,3)search("\([1-9]+\)","ab123(0456)(789)45ab")#>>(789)(11,16)search("[1-9]\d+","ab01203d45")#>>1203(3,7)88re.findall函數(shù)89re.findall(pattern,string,flags=0)查找字符串中所有和模式匹配的子串(不重疊)放入列表。一個子串都找不到就返回空表[]re.finall函數(shù)importreprint(re.findall('\d+',"thisis334whatme774gw"))#>>['334','774']print(re.findall('[a-zA-Z]+',"Adoghas4legs.這是true"))#>>['A','dog','has','legs','true']print(re.findall('\d+',"thisisgood.")) #>>[]print(re.findall("aaa","baaaa")) #>>['aaa']90re.finditer函數(shù)91re.finditer(pattern,string,flags=0)查找字符串中所有和模式匹配的子串(不重疊),每個子串對應(yīng)于一個匹配對象,返回匹配對象的序列(準(zhǔn)確說是“可調(diào)用迭代器”)如果找不到匹配子串,返回值也不為None或空表。假設(shè)返回值為r,則list(r)為[]re.finditer函數(shù)importre s='233[32]88ab<433>(21)'m='\[\d+\]|<\d+>' #|表示'或'forxinre.finditer(m,s): #x是匹配對象
print(x.group(),x.span())i=0foryinre.finditer(m,"aaaaa"):i+=1 #不會被執(zhí)行輸出:[32](3,7)<433>(11,16)92分組信息科學(xué)技術(shù)學(xué)院郭煒圣彼得堡彼得霍夫?qū)m括號中的表達(dá)式是一個分組。多個分組按左括號從左到右從1開始依次編號importrex=re.search('[a-z]+(\d+)[a-z]+',"ab123dhello553world47")print(x.group(1)) #>>553m="(((ab*)c)d)e"r=re.match(m,"abcdefg")print(r.group(0)) #>>abcde group(0)等價于group() print(r.group(1)) #>>abcdprint(r.group(2)) #>>abcprint(r.group(3)) #>>abprint(r.groups()) #>>('abcd','abc','ab')分組(...)括號中的表達(dá)式是一個分組。多個分組按左括號從左到右從1開始依次編號importrem="(ab*)(c(d))e"r=re.match(m,"abcdefg")print(r.groups()) #>>('ab','cd','d')print(r.group(0)) #>>abcdeprint(r.group(1)) #>>abprint(r.group(2)) #>>cdprint(r.group(3)) #>>d分組(...)在分組的右邊可以通過分組的編號引用該分組所匹配的子串importrem=r'(((ab*)c)d)e\3' #r表示字符串里的'\'不再轉(zhuǎn)義#要求ab*cde后面跟著3號分組在本次匹配中匹配上的子串r=re.match(m,"abbbcdeabbbkfg")#紅色部分少一個b則不能匹配print(r.group(3)) #abbbprint(r.group()) #abbbcdeabbb分組(...)在分組的右邊可以通過分組的編號引用該分組所匹配的子串pt='a(.)\\1*b'#或pt=r'a(.)\1*b'print(re.search(pt,'kacccccb').group()) #>>acccccbprint(re.search(pt,'kaxxxxb').group()) #>>axxxxbprint(re.search(pt,'kaxb').group()) #>>axbx=re.search(pt,'kaxyb')ifx!=None:print(x.group()) #不會執(zhí)行分組(...)分組作為一個整體,后面可以跟量詞importrem="(((ab*)+c)d)e"r=re.match(m,"ababcdefg")print(r.groups()) #>>('ababcd','ababc','ab')r=re.match(m,"abacdefg")print(r.groups()) #>>('abacd','abac','a')不要求分組的多次出現(xiàn)必須匹配相同字符串分組(...)在正則表達(dá)式中沒有分組時,re.findall返回所有匹配子串構(gòu)成的列表。有且只有一個分組時,re.findall返回的是一個子串的列表,每個元素是一個匹配子串中分組對應(yīng)的內(nèi)容。importrem='[a-z]+(\d+)[a-z]+'x=re.findall(m,"13bc12deab11cd320ef")print(x) #>>['12','320']re.findall和分組在正則表達(dá)式中有超過一個分組時,re.findall返回的是一個元組的列表,每個元組對應(yīng)于一個匹配的子串,元組里的元素,依次是1號分組、2號分組、3號分組匹配的內(nèi)容importrem='(\w+)(\w+)'r=re.match(m,"helloworld")print(r.groups()) #>>('hello','world')print(r.group(1)) #>>helloprint(r.group(2)) #>>worldr=re.findall(m,"helloworld,thisisverygood")#找出由所有能匹配的子串的groups()構(gòu)成的元組,互相不重疊print(r)#>>[('hello','world'),('this','is'),('very','good')]findall和分組re.sub(模式串,替換串,母串)用于替換匹配的子串importres='abc.xyz'print(re.sub(r'(.*)\.(.*)',r'\2.\1',s)) #>>xyz.abc#用'(.*)\.(.*)'匹配s,并用'\2.\1'替換s中被匹配的子串#\2代表第2個分組匹配的內(nèi)容,\1是第一個分組匹配的內(nèi)容re.sub和分組|的用法信息科學(xué)技術(shù)學(xué)院郭煒圣彼得堡阿芙樂爾號巡洋艦表示“或”,如果沒有放在"()"中,則起作用范圍是直到整個正則表達(dá)式開頭或結(jié)尾或另一個"|""\w{4}ce|c\d{3}|p\w" 可以匹配:"c773""ab12ce""pk""|"的用法從左到右短路匹配(匹配上一個后就不計算是否還能匹配后面的)importrept="\d+\.\d+|\d+"print(re.findall(pt,"12.34thisis125"))#>>['12.34','125']pt="aa|aab"print(re.findall(pt,"aabcdeaa12aab"))#>>['aa','aa','aa']"|"的用法'|'也可以用于分組中,起作用范圍僅限于分組內(nèi)importrem="(((ab*)+c|12)d)e"print(re.findall(m,'ababcdefgKK12deK'))#>>[('ababcd','ababc','ab'),('12d','12','')]forxinre.finditer(m,'ababcdefgKK12deK'):print(x.groups())#>>('ababcd','ababc','ab')#>>('12d','12',None)m='\[(\d+)\]|<(\d+)>'forxinre.finditer(m,'233[32]88ab<433>'):print(x.group(),x.groups())
#>>[32]('32',None)#>><433>(None,'433')"|"的用法貪婪模式
和
懶惰模式信息科學(xué)技術(shù)學(xué)院郭煒美國圣地亞哥中途島號航母量詞的貪婪模式107量詞+,*,?,{m,n}默認(rèn)匹配盡可能長的子串importreprint(re.match("ab*","abbbbk").group()) #>>abbbbprint(re.findall("<h3>(.*)</h3>", "<h3>abd</h3><h3>bcd</h3>"))#>>['abd</h3><h3>bcd']print(re.findall('\(.+\)', "Adoghas(havea).這(哈哈)true()me"))#>>['(havea).這(哈哈)true()']量詞的非貪婪(懶惰)模式108在量詞+,*,?,{m,n}后面加'?'則匹配盡可能短的字符串
。importrem="a.*?b"forkinre.finditer(m,"aabab"):print(k.group(),end="")#>>aababm="<h3>.*?</h3>"a=re.match(m,"<h3>abd</h3><h3>bcd</h3>")print(a.group()) #>><h3>abd</h3>m="<h3>.*?[M|K]</h3>"a=re.match(m,"<h3>abd</h3><h3>bcK</h3>")print(a.group())#>><h3>abd</h3><h3>bcK</h3>量詞的非貪婪(懶惰)模式109在量詞+,*,?,{m,n}后面加'?'則匹配盡可能短的字符串
。importreprint(re.findall('\d+?',"thisis334whatme774gw"))#>>['3','3','4','7','7','4']print(re.findall('[a-zA-Z]+?',"Adoghas4legs.這是true"))#>>['A','d','o','g','h','a','s','l','e','g','s','t','r','u','e']print(re.findall('\(.*?\)',"Adoghas(have).這(哈哈)true()me"))#>>['(have)','(哈哈)','()']應(yīng)用實例信息科學(xué)技術(shù)學(xué)院郭煒瑞典斯德哥爾摩諸葛亮口中的曹操
找出三國演義中,在諸葛亮提到曹操的所有場景,他是怎么說的模式:孔明曰:“倘曹操引兵來到,當(dāng)如之何?”孔明曰:“公瑾主意欲降操,甚為合理?!笨酌鞔鹪唬骸安懿倌藵h賊也,又何必問?”孔明笑曰:“今操引百萬之眾,”:“”都是中文的111諸葛亮口中的曹操importref=open("c:/tmp/三國演義utf8.txt","r",encoding="utf-8")txt=f.read()f.close()pt="(孔明.{0,2}曰:“[^”]*(曹操|(zhì)曹賊|操賊|曹阿瞞|操).*?”)"a=re.findall(pt,txt)print(len(a)) #>>58forxina:#x形如:('孔明答曰:“曹操乃漢賊也,又何必問?”','操') print(x[0])112抽取ip地址、郵箱、網(wǎng)址importreipadr=r"\b((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\b"mailbox=r"\b[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+\b"url=r'http://[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(/[-a-zA-Z0-9]+)*\b's="Myipis,thisis/python/new,mymailboxisguo_wei@.ok?"m=re.search(ipadr,s)ifm!=None:print(m.group())#>>113抽取ip地址、郵箱、網(wǎng)址m=re.search(mailbox,s)ifm!=None:print(m.group()) #>>guo_wei@forxinre.finditer(url,s):print(x.group())#>>/python/new114簡化正則表達(dá)式的編寫一般來說,要寫一個精確的正則表達(dá)式,比如寫一個正則表達(dá)式來匹配ip地址,要做到匹配它的字符串一定是ip地址,且ip地址一定能匹配它,是比較困難的。正則表達(dá)式可以寫得寬容一些,即ip地址一定能匹配它,但是能匹配它的不一定是ip地址。對匹配的字符串,另外再做一些額外的判斷排除掉非ip地址,這樣做比寫精確的正則表達(dá)式容易。例如:'\d+\.(\d{1,3}\.){2}\d+'然后再split以后手動判斷每一段是不是都小于255115信息科學(xué)技術(shù)學(xué)院116
實用Python程序設(shè)計玩轉(zhuǎn)Python生態(tài)信息科學(xué)技術(shù)學(xué)院117使用Python的庫信息科學(xué)技術(shù)學(xué)院
郭煒美國黃石公園Python自帶的庫
math,re,datetime,turtle,random
無數(shù)第三方的庫
Pillow,jieba,request,matplotlib
119Python的庫進(jìn)入cmd命令行窗口進(jìn)入安裝Python的文件夾,默認(rèn)通常是: C:\Users\你的用戶名\AppData\Local\Programs\Python\Python37
不知道的話查找python.exe可以找到3)再進(jìn)入scripts文件夾4)pipinstall庫名120安裝Python第三方庫菜單:File|Settings121Pycharm中安裝Python第三方庫2.點(diǎn)這里1.選這里122Pycharm中安裝Python第三方庫2.點(diǎn)這里1.輸入庫名,回車importturtle #turtle是一個類turtle.setup(800,600)turtle.fd()或:importturtleastt #此后tt等價于turtlett.setup(800,600)tt.fd(100)123用import導(dǎo)入庫importPIL.Image#PIL.Image是類中的類img=PIL.Image.open("c:/tmp/pic/grass.jpg")#將圖像文件載入對象imgimg.show()或:fromPILimportImage
#從PIL庫導(dǎo)入Image類進(jìn)行圖像處理img=Image.open("c:/tmp/pic/grass.jpg")#將圖像文件載入對象img124import的用法importPIL.Image,PIL.ImageDraw,PIL.ImageFontimg=PIL.Image.open("c:/tmp/pic/grass.jpg")#將圖像文件載入對象imgdraw=PIL.ImageDraw.Draw(img)#以后就可以通過draw在img上畫圖、寫字myFont=PIL.ImageFont.truetype("C:\\Windows\\Fonts\\simhei.ttf",164)或fromPILimportImage,ImageDraw,ImageFontimg=Image.open("c:/tmp/pic/grass.jpg")#將圖像文件載入對象imgdraw=ImageDraw.Draw(img)#以后就可以通過draw在img上畫圖、寫字myFont=ImageFont.truetype("C:\\Windows\\Fonts\\simhei.ttf",164)125import的用法fromopenpyxl.stylesimportFont,colors,AlignmentboldRedFont=Font(size=18,name='TimesNewRoman',bold=True,color=colors.RED)alignment=Alignment(horizontal='left',vertical='center')126import的用法用datetime庫
處理日期、時間信息科學(xué)技術(shù)學(xué)院
郭煒陽朔遇龍河importdatetime#導(dǎo)入datetime模塊dtBirth=dateti
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海外房產(chǎn)銷售培訓(xùn)總結(jié)
- 金屬材絲拉拔工創(chuàng)新方法能力考核試卷含答案
- 氯甲烷生產(chǎn)工安全實踐模擬考核試卷含答案
- 鍋爐除灰、脫硫、脫硝設(shè)備檢修工班組考核評優(yōu)考核試卷含答案
- 上海天德建設(shè)(集團(tuán))有限公司“1028”起重傷害死亡事故調(diào)查報告
- 酒店員工培訓(xùn)與業(yè)務(wù)技能培養(yǎng)制度
- 酒店客房預(yù)訂與分配制度
- 酒店餐飲食品安全管理制度
- 桑蠶種養(yǎng)培訓(xùn)課件
- 財務(wù)報告編制與審查制度
- 基底節(jié)出血的護(hù)理查房
- 2025年廣東省中考物理試題卷(含答案)
- 金華東陽市國有企業(yè)招聘A類工作人員筆試真題2024
- 2025年6月29日貴州省政府辦公廳遴選筆試真題及答案解析
- 2025年湖南省中考數(shù)學(xué)真題試卷及答案解析
- DB32/T 3518-2019西蘭花速凍技術(shù)規(guī)程
- 急救中心工作匯報
- 裝修敲打搬運(yùn)合同協(xié)議書
- 2025年公共管理改革的熱點(diǎn)問題試題及答案
- 《世界經(jīng)濟(jì)史學(xué)》課件
- 四川省綿陽市2024屆中考數(shù)學(xué)試卷(含答案)
評論
0/150
提交評論