《Python程序設(shè)計(jì)基礎(chǔ)(第2版)》課件 06文件_第1頁(yè)
《Python程序設(shè)計(jì)基礎(chǔ)(第2版)》課件 06文件_第2頁(yè)
《Python程序設(shè)計(jì)基礎(chǔ)(第2版)》課件 06文件_第3頁(yè)
《Python程序設(shè)計(jì)基礎(chǔ)(第2版)》課件 06文件_第4頁(yè)
《Python程序設(shè)計(jì)基礎(chǔ)(第2版)》課件 06文件_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Python程序設(shè)計(jì)基礎(chǔ)第6章文件教師:XXX第6章

文件6.1文件的基本概念6.2文件基本操作6.3文件與文件夾操作6.4編程實(shí)例6.1文件的基本概念文件是存儲(chǔ)在外部存儲(chǔ)器中的一組信息的集合。按照文件的數(shù)據(jù)組織形式,文件分為文本文件(無(wú)格式)和二進(jìn)制文件(有格式)兩種。文本文件將數(shù)據(jù)視為字符,在文件中保存字符的編碼(ASCII,

GBK,

UTF-8等)。例如,要存儲(chǔ)字符串“world”,可將每個(gè)字符的ASCII碼依次保存到文件中,保存結(jié)果如下圖。forcin'world':

print(f'{ord(c):b}')#輸出字符編碼,ord返回編碼常見文本文件:記事本文件(.txt),源代碼,網(wǎng)頁(yè),日志等。6.1文件的基本概念二進(jìn)制文件把數(shù)據(jù)的二進(jìn)制值存儲(chǔ)到文件中,可能還包含不同的格式信息。例如,有一個(gè)整數(shù)20190306,因?yàn)橐粋€(gè)整數(shù)占4字節(jié),所以把它保存在外部存儲(chǔ)器中也要占4字節(jié)。將這個(gè)整數(shù)以二進(jìn)制形式保存到文件中的結(jié)果如下圖所示。00000001001101000001010001100010print(bin(20190306))'0b1001101000001010001100010'注:文本文件和二進(jìn)制文件存儲(chǔ)是不同的。例如將12視為文本字符'12',存儲(chǔ)時(shí)需要2個(gè)字節(jié):0011000100110010。如視為整數(shù)(需4個(gè)字節(jié)):

00000000000000000000000000001100。本章重點(diǎn)掌握文本文件處理。二進(jìn)制文件:Word/Excel/圖片/音樂(lè)/程序,絕大部分文件都是二進(jìn)制文件。6.1文件的基本概念Python讀/寫文件的基本流程如下圖所示。文件函數(shù)主要有:f=open(fname,mode)s=f.read()line=f.readline()lst=f.readlines()f.write(s)f.writelines(lst)f.close()#寫文件f=open('a.txt','w')f.write('IlovePython\n')f.write('111222\n')f.close()#讀文件f=open('a.txt','r')s=f.read()f.close()print(s)6.2文件基本操作6.2.1

用內(nèi)置函數(shù)open打開文件操作文件前一定要先打開文件。內(nèi)置函數(shù)open()可打開文件,格式為f=open(文件名,文件模式,編碼方式)打開文件后,借助文件變量f來(lái)讀寫文件。文件模式含

義"r"只讀方式打開文件(默認(rèn)),不能寫入"w"只寫方式打開文件。若文件已存在,則先清空原有內(nèi)容"a"向文件末尾追加數(shù)據(jù),不覆蓋原有內(nèi)容。如文件不存在則新建。"x"以寫模式新建一個(gè)文件,若文件已存在,則拋出異常"b"打開二進(jìn)制文件,必須與其他模式合用(rb,wb等)"t"打開文本文件(默認(rèn)),必須與其他模式合用(rt,wt等)"+"必須與其他模式合用(r+,a+)。擴(kuò)展,兼具讀和寫的功能例如rt:讀文本,wt:寫文本,a:追加,r+:可讀可寫,w+:可讀可寫wb:寫二進(jìn)制,a+:追加/可讀。注意:不能寫"rw"6.2文件基本操作打開文件時(shí)需指定是文本文件("t")還是二進(jìn)制文件("b"),默認(rèn)為"t"。例如:fw=open(r"d:\test.txt","wt")#w寫,t文本(t可省略)該語(yǔ)句的作用是以“w”只寫方式打開d盤根目錄下的文本文件"test.txt"。注:此處的r表示原始字符串,這樣\t就不會(huì)被視為轉(zhuǎn)義字符。如果沒(méi)有r,d:\test.txt由于轉(zhuǎn)義不會(huì)被理解為正確的文件名,將報(bào)錯(cuò)。此處也可寫為open("d:\\test.txt","w")或open("d:/test.txt","w")。

fr=open(r"d:\file1.txt","r")#只讀,"r"可省略該語(yǔ)句的作用是以“r”只讀方式打開d盤根目錄下的文本文件"file1.txt",'r'要求文件必須事先存在。6.2文件基本操作fbw=open(r"d:\file2.dat","wb")#b二進(jìn)制,較少用該語(yǔ)句以“只寫”方式打開d盤的二進(jìn)制文件"file2.dat"。注:Python默認(rèn)按操作系統(tǒng)平臺(tái)的編碼處理文件。Windows中文系統(tǒng)默認(rèn)編碼為GBK,而test.txt文件是用utf-8編碼,因此打開該文件時(shí)必須指定編碼。如不指定,打開文件后讀取時(shí)將報(bào)錯(cuò)。對(duì)英文而言,utf-8和ascii是一樣的。記事本存盤時(shí)可選擇保存編碼。蘋果電腦的默認(rèn)編碼是utf-8。Python源文件默認(rèn)按utf-8編碼保存,如果內(nèi)含中文注釋,當(dāng)用open打開時(shí)就應(yīng)指定encoding='utf-8'。fr=open(r"d:\test.txt","r",encoding="utf-8")以“只讀”方式打開d盤文件"test.txt",指定編碼方式為"utf-8"。下面的例子驗(yàn)證GBK和utf-8是不同的編碼In:'中文'.encode('GBK')#GBK/CP936/GB2312/ANSI均可Out:b'\xd6\xd0\xce\xc4'#GBK,1個(gè)漢字的編碼需2字節(jié)In:'中文'.encode('utf-8')Out:b'\xe4\xb8\xad\xe6\x96\x87'#utf-8,1個(gè)漢字的編碼需3字節(jié)6.2文件基本操作6.2.2

文件對(duì)象的屬性和常用方法函數(shù)open()返回一個(gè)可迭代的文件對(duì)象,通過(guò)該對(duì)象對(duì)文件進(jìn)行操作。文件對(duì)象f常用屬性如下。屬

性類

型說(shuō)

明f.closed布爾型判斷文件是否關(guān)閉,關(guān)閉為True,否則為Falsef.mode字符串文件的打開模式字符串文件的名稱fr=open(r"d:\test.txt","r",encoding="utf-8")#fr文件對(duì)象fr.closed #此處是屬性,不用寫括號(hào)Out:Falsefr.mode #fr的模式Out:'r'fr.name #fr對(duì)應(yīng)的文件名Out:'d:\\test.txt'6.2文件基本操作方法功

能返

值f.close()緩沖區(qū)內(nèi)容寫入文件,關(guān)閉文件并釋放緩沖區(qū)無(wú)f.flush()緩沖區(qū)的內(nèi)容寫入文件,不關(guān)閉文件無(wú)f.read(size)從文件讀取指定的字符數(shù),若未給定size則讀取所有內(nèi)容讀取的字符f.readline()從文件中讀取一行,包括"\n"字符從文件中讀取的一行字符串f.readlines()讀取所有行(直到文件結(jié)束),返回字符串列表字符串列表,包含所有的行f.seek(offset[,whence])移動(dòng)文件指針。offset:開始的偏移量,代表需要偏移的字節(jié)數(shù);whence:可選0/1/2,代表不同的起點(diǎn)位置無(wú)f.tell()返回文件指針的當(dāng)前位置指針的當(dāng)前位置f.write(s)向文件中寫入字符串s寫入的字符長(zhǎng)度f(wàn).writelines(lst)向文件中寫入一個(gè)字符串列表lst無(wú)6.2.2

文件對(duì)象f的常用方法6.2文件基本操作6.2.3關(guān)閉文件完成文件操作后,一定要關(guān)閉文件才能保存修改并釋放文件。例如

:fw.close()fr.close()關(guān)鍵字with可以自動(dòng)管理資源,在退出with時(shí)會(huì)自動(dòng)關(guān)閉文件(可省略f.close()語(yǔ)句)。with一般語(yǔ)法如下:withopen(文件名,文件模式)asfr:s=fr.read()#with語(yǔ)句結(jié)束時(shí)會(huì)自動(dòng)關(guān)閉文件fw=open('f1.txt','w')fw.write('111\n') #數(shù)值必須以字符串形式寫入fw.write('222\n') #此時(shí)數(shù)據(jù)在緩沖區(qū),還未存入文件fw.close() #關(guān)閉文件后數(shù)據(jù)才真正寫入文件6.2文件基本操作6.2.4讀/寫文本文件用文件對(duì)象的read()方法按字符數(shù)讀文件?!纠?】在data子目錄中有一個(gè)文件log.txt,其內(nèi)容如下:第一行第二行編寫程序讀取其中的前6個(gè)字符。程序如下:注:第一行后的換行符"\n"也算一個(gè)字符,所以'第一行\(zhòng)n'有4個(gè)字符。/和\都可以作為路徑分隔符。'data/log.txt'或r'data\log.txt'均可。輸出如下:withopen("data/log.txt","r")asf:a=f.read(6) #讀6個(gè)字符,不指定則讀取全部print(a,end='')6.2文件基本操作【例2】按行遍歷文件的所有行。程序如下:因?yàn)楹瘮?shù)open()返回的文件對(duì)象是一個(gè)可迭代對(duì)象,所以用函數(shù)readlines()讀取文件的語(yǔ)句可以省略。上段程序可簡(jiǎn)寫為:輸出結(jié)果如下:第一行

#print()本身要換行,字符串內(nèi)也含有'\n',所以輸出時(shí)有空行

第二行withopen("data/log.txt","r")asf:a=f.readlines()#讀取所有的行,得到字符串列表aforlineina:print(line)withopen("data/log.txt")asf:forlineinf:print(line,end='')6.2文件基本操作數(shù)值必須轉(zhuǎn)為字符串才能寫到文本文件中?!纠?】隨機(jī)生成一個(gè)長(zhǎng)度為100的整數(shù)列表,范圍為1~100,將該列表以每10個(gè)一行(元素間以空格分隔)寫入文本文件"tmp/record.txt"中。fromrandomimportrandinta=[]foriinrange(100):a.append(randint(1,100))withopen("tmp/record.txt","w")asf:s=""fori,vinenumerate(a):s=s+f"{v}"

#數(shù)值轉(zhuǎn)字符串,連接起來(lái)

if(i+1)%10==0: #每10個(gè)數(shù)一行f.write(s+"\n") #寫入時(shí)添加換行符'\n's="" 6.2文件基本操作【例4】將例3中的文本文件"tmp/record.txt"中的數(shù)字讀入一個(gè)列表,并輸出該列表。b=[]withopen("tmp/record.txt")asf: #文件應(yīng)存在forlineinf:line=line.strip() #strip刪除字符串兩側(cè)的空格/換行符等data=line.split() #split分解得到字符串列表['10','23',.....'89']forvindata:b.append(eval(v))#轉(zhuǎn)為整數(shù),將單個(gè)整數(shù)添加到列表print(b)6.2文件基本操作6.2.5使用pickle模塊讀/寫二進(jìn)制文件把內(nèi)存中的數(shù)據(jù)對(duì)象寫入二進(jìn)制文件稱為序列化,從二進(jìn)制文件讀出并重建原數(shù)據(jù)對(duì)象稱為反序列化。例如保存或讀出游戲進(jìn)度。這些操作可借助pickle模塊(自帶)。模塊中的dump()是寫入函數(shù),load()是讀函數(shù)。寫入語(yǔ)法:pickle.dump(待寫入變量,文件對(duì)象)待寫變量:數(shù)值、字符串、列表、元組、字典等。文件對(duì)象:應(yīng)為"wb"模式打開的二進(jìn)制文件對(duì)象,將各類數(shù)據(jù)寫入其中?!纠?】將如下數(shù)據(jù)寫入二進(jìn)制文件binary.dat中。importpicklea=1234;b=3.14159;c="程序";d=['a','b','c'];e={"張":60,"王":70,"李":80}withopen("tmp/binary.dat","wb")asf:#b不能省略

pickle.dump(a,f)pickle.dump(b,f)pickle.dump(c,f)pickle.dump(d,f)pickle.dump(e,f)注:二進(jìn)制文件在Ipython中用!type查看是亂碼。6.2文件基本操作【例6】讀取并輸出二進(jìn)制文件"tmp/binary.dat"中的數(shù)據(jù)。輸出:12343.14159程序['a','b','c']{'張':60,'王':70,'李':80}注:二進(jìn)制文件的數(shù)據(jù)格式不統(tǒng)一,所以存入/讀出一般應(yīng)使用同樣的庫(kù)。dump()和load()會(huì)自動(dòng)處理不同數(shù)據(jù)之間的邊界。這實(shí)際上是一種簡(jiǎn)單的數(shù)據(jù)持久化方法。importpicklewithopen("tmp/binary.dat","rb")asf: #b不能省略a=pickle.load(f) #按存入的順序依次讀出b=pickle.load(f)c=pickle.load(f)d=pickle.load(f)e=pickle.load(f)print(a,b,c,d,e)6.2文件基本操作【例7】字典變量role={'道具1':10,'道具2':21,'武力值':100}記錄了某游戲角色當(dāng)前的屬性,請(qǐng)首先將該變量保存到文件中,然后用隨機(jī)數(shù)模擬游戲運(yùn)行中的屬性值變化,最后從文件中恢復(fù)原值。importpicklefromrandomimportrandintrole={'道具1':10,'道具2':20,'武力值':100}withopen('tmp/game.pkl','wb')asfw:pickle.dump(role,fw)for_inrange(3):forkeyinrole:role[key]+=randint(-3,3)#屬性值隨機(jī)變動(dòng),模擬游戲運(yùn)行print(f'模擬游戲運(yùn)行三次后,role={role}')withopen('tmp/game.pkl','rb')asfr:role=pickle.load(fr)print(f'恢復(fù)原值后,role={role}')6.2文件基本操作6.2.6文件定位文件指針用于標(biāo)示文件當(dāng)前讀/寫位置。讀寫時(shí),都從文件指針的當(dāng)前位置開始,根據(jù)讀寫的數(shù)據(jù)量向后移動(dòng)文件指針。函數(shù)tell()返回文件指針的當(dāng)前位置。文件剛打開時(shí)指向位置0?!纠?】文件"log1.txt"中保存了一個(gè)字符串"python"。編程,打開該文件并讀取三次,每次讀2個(gè)字符,輸出每次讀的內(nèi)容及讀取后的文件指針值。withopen("data/log1.txt","r")asf:h=f.read(2)print(h)print("pos={}".format(f.tell()))j=f.read(2)print(j)print("pos={}".format(f.tell()))k=f.read(2)print(k)print("pos={}".format(f.tell()))注:指針指向文件末尾了,繼續(xù)讀入將返回空,不報(bào)錯(cuò)。6.2文件基本操作文件對(duì)象的seek()方法可移動(dòng)文件指針,f.seek(偏移值[,起點(diǎn)])。偏移值表示移動(dòng)的距離;起點(diǎn)表示從哪里開始移動(dòng):起點(diǎn)0(默認(rèn))表示從文件頭開始;1表示從當(dāng)前位置開始;2表示從文件尾開始。f.seek(10,0) #移動(dòng)到距離文件頭部10個(gè)字符處,起點(diǎn)0可省略f.seek(0,0) #移動(dòng)到文件頭部f.seek(4,1) #從當(dāng)前位置再向后(尾部)移動(dòng)4字節(jié)f.seek(-3,1) #從當(dāng)前位置再向前(頭部)移動(dòng)3字節(jié)f.seek(-6,2) #移到距離文件尾部6個(gè)字節(jié)處注:文本文件僅支持起點(diǎn)0和正偏移值,二進(jìn)制文件支持起點(diǎn)0/1/2和負(fù)偏移?!纠?】文件"log2.txt"中保存了字符串"pythonprogram"。編程,打開該文件并只讀取字符串"program"。withopen("data/log2.txt")asf:f.seek(7)h=f.read(7)print(h)6.2文件基本操作文件指針練習(xí):寫入數(shù)據(jù)后立即再讀出數(shù)據(jù)。withopen("aaa.txt","w+")asf:#w+可寫可讀,模式不能寫為wrf.write("01234")f.write("56789")f.seek(2)

#距文件頭2個(gè)字符s=f.read(4)print('s=',s)f.write('abc') #指針自動(dòng)先移到末尾,再寫入6.2文件基本操作6.2.7讀/寫docx文件Python和Word結(jié)合可完成一些文檔自動(dòng)生成的工作。包docx是讀寫word文件的第三方包。安裝命令pipinstallpython-docxfromdocximportDocumentdoc=Document()

#建立新文檔對(duì)象docp=doc.add_paragraph('無(wú)格式的部分')p.add_run('加粗部分').bold=Truep.add_run('無(wú)格式')p.add_run('斜體部分').italic=Truedoc.save("tmp/test.docx")官網(wǎng)教程

https://python-docx.readthedocs.io/en/latest/中文教程https://hellowac.github.io/docx-doc-zh/tutorial.html1.建立新Word文檔及添加段落和設(shè)置格式test.docx內(nèi)容如右所示:6.2.7讀/寫docx文件#補(bǔ)充:一個(gè)應(yīng)用實(shí)例,設(shè)置docx文檔格式fromdocximportDocumentfromdocx.sharedimportPt,RGBColor#字號(hào),顏色fromdocx.oxml.nsimportqn #字體doc=Document() #生成新文檔doc.styles['Normal'].='宋體' #全局默認(rèn)字體doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'),'宋體')doc.add_heading('標(biāo)題1',level=1)#添加標(biāo)題p=doc.add_paragraph() #添加段落run=p.add_run('紅色宋體24磅')run.font.size=Pt(24) #設(shè)置字號(hào)run.font.color.rgb=RGBColor(255,0,0) #設(shè)置紅色,

RGB(紅,綠,藍(lán))run=p.add_run('綠色微軟雅黑12磅')='微軟雅黑' #局部字體run._element.rPr.rFonts.set(qn('w:eastAsia'),'微軟雅黑')run.font.size=Pt(12) #設(shè)置字號(hào)run.font.color.rgb=RGBColor(0,255,0) #設(shè)置綠色run.bold=True;run.italic=True #設(shè)置粗體和斜體p2=doc.add_paragraph('第2個(gè)段') #添加段落doc.save('test.docx') #覆蓋保存到test.docx 6.2文件基本操作3.讀取文檔的所有段落Document對(duì)象的paragraphs屬性包含了文檔的所有段落,對(duì)該屬性進(jìn)行遍歷可以操作文檔的所有段落。段落對(duì)象的text屬性代表該段落的文字。fromdocximportDocumentdoc=Document("tmp/test.docx")#文件應(yīng)已存在forpindoc.paragraphs: print(p.text)6.2文件基本操作4.讀取文檔表格中的文字Document對(duì)象的tables屬性是一個(gè)包含文檔所有Table表格對(duì)象的列表,一個(gè)Table代表文檔的一個(gè)表格。表格對(duì)象的_cells屬性是一個(gè)包含表格所有單元格對(duì)象的列表。單元格對(duì)象的text屬性代表該單元格的文字。fromdocximportDocumentdoc=Document("data/word表格.docx")fortindoc.tables:#tables含所有表,不含非表格內(nèi)的文字forcint._cells: #單個(gè)表的所有單元格print(c.text)#單個(gè)單元格內(nèi)的文字6.2.8讀寫xlsx文件openpyxl支持xlsx文件,不支持舊格式xls。安裝命令為:pipinstallopenpyxl1.創(chuàng)建Excel工作簿和工作表fromopenpyxlimportWorkbookwb=Workbook()wb.create_sheet("first")wb.create_sheet("second")wb.save("tmp/test.xlsx")Sheet工作表是默認(rèn)存在的,first和second是程序新建的。6.2文件基本操作3.修改單元格的數(shù)據(jù)要修改表格數(shù)據(jù),需要先調(diào)用load_workbook()獲取工作簿。有三種方法從工作簿中得到其中的一個(gè)工作表:第一種是用Workbook對(duì)象的get_sheet_by_name方法,其參數(shù)是工作表的名稱,此為舊方法;第二種是用Workbook對(duì)象的worksheets屬性,該屬性是一個(gè)Worksheet

對(duì)象列表,如ws=wb.worksheets[1];第三種是通過(guò)索引方式,下標(biāo)為工作表的名字,如ws=wb['first']。fromopenpyxlimportWorkbook,load_workbookwb=load_workbook("tmp/test.xlsx")#文件已存在且不能已被Excel打開ws=wb["first"] #first表應(yīng)存在#接下頁(yè)6.2文件基本操作#各種訪問(wèn)單元格的語(yǔ)法ws['A1']="數(shù)學(xué)" #行列坐標(biāo)ws['B1']="語(yǔ)文"ws['C1']="總分"ws.cell(2,1,90) #第2行第1列,即A2單元ws.cell(2,2,91) #B2ws.append([80,81])ws['C2']="=sum(A2:B2)"#公式ws['C3']="=sum(A3:B3)"wb.save("tmp/test.xlsx")4.讀取Excel單元格中的數(shù)據(jù)獲取一個(gè)Cell對(duì)象后,訪問(wèn)Cell對(duì)象的value屬性即可讀取數(shù)據(jù)。注:使用第8章的pandas庫(kù)處理excel文件最方便fromopenpyxlimportWorkbook,load_workbookwb=load_workbook("tmp/test.xlsx",data_only=True)#工作簿ws=wb['first']#工作表print(ws['C1'].value)#單元格print(ws['C2'].value)6.3文件與文件夾操作6.3.1

os模塊os模塊是Python標(biāo)準(zhǔn)庫(kù),提供了文件與文件夾的相關(guān)操作。方

法功能說(shuō)明rename(src,dst)重命名文件或目錄,兼具文件移動(dòng)功能remove(path)刪除指定的文件,要求用戶擁有刪除文件的權(quán)限,并且文件沒(méi)有只讀或其他特殊屬性rmdir(path)刪除文件夾,文件夾必須為空mkdir(path)創(chuàng)建子文件夾,不能多級(jí)目錄一起創(chuàng)建makedirs(path)可一次性創(chuàng)建多級(jí)目錄chdir(path)把path設(shè)為當(dāng)前工作目錄getcwd()返回當(dāng)前工作目錄名listdir(path)返回path目錄下的一級(jí)文件和目錄列表startfile(filepath,operation)使用關(guān)聯(lián)的應(yīng)用程序打開指定文件system(程序名)啟動(dòng)外部程序6.3文件與文件夾操作importosos.rename("wt.txt","wtt.txt")#將"wt.txt"改名為"wtt.txt"#將"wt.txt"改名并移動(dòng)到子文件夾"tmh"中os.rename("wt.txt","tmh\\wtt.txt")os.remove("tmh\\wtt.txt")#刪除子文件夾"tmh"中的文件"wtt.txt"os.rmdir("tmh") #刪除子文件夾tmh(要求為空)os.mkdir("d:\\tmh") #在d盤根目錄下建一個(gè)文件夾tmhos.chdir("d:\\tmh") #把d:\\tmh設(shè)置為當(dāng)前工作目錄os.getcwd() #返回當(dāng)前工作目錄名os.system('notepad.exe')

#啟動(dòng)記事本程序os.startfile('movie.mp4')#啟動(dòng)相應(yīng)的視頻播放程序importshutil#補(bǔ)充:使用shutil庫(kù)shutil.rmtree('tmh') #刪除子文件夾tmh(不為空也可)shutil.copyfile('log.txt','b.txt')#將log.txt復(fù)制得到b.txt6.3文件與文件夾操作os.listdir(path)的功能是返回path目錄下的一級(jí)文件和目錄列表。對(duì)該列表進(jìn)行遞歸遍歷可以遍歷文件夾path下的所有文件和子文件夾。fromos.pathimportisfile,isdirfromosimportlistdirdeftraverseDir(path):#遍歷目錄path,輸出文件名和子目錄名forpinlistdir(path):subpath=path+"\\"+p#構(gòu)建完整的文件路徑ifisfile(subpath):print(subpath) #如果是文件,輸出文件名elifisdir(subpath):#如果是子目錄print(subpath)#輸出目錄名

traverseDir(subpath)#并遞歸調(diào)用traverseDir(r'd:\python')6.3文件與文件夾操作6.3.2

os.path模塊os.path模塊提供關(guān)于路徑判斷、文件名連接及切分的方法。方

法功能說(shuō)明isdir(path)判斷path是否為文件夾,返回True/Falseisfile(path)判斷path是否為文件basename(path)返回指定路徑的最后一個(gè)組成部分dirname(p)返回給定路徑的文件夾部分exists(path)判斷文件path是否存在getsize(filename)返回文件的大小join(path,*paths)連接兩個(gè)或多個(gè)pathsplitext(path)從路徑中分割文件的擴(kuò)展名6.3文件與文件夾操作importos.pathos.path.basename(r'D:\Workspace\tmh\t7.txt')返回路徑的最后一個(gè)組成部分't7.txt'os.path.dirname(r'D:\Workspace\tmh\t7.txt')返回該路徑的文件夾部分'D:\\Workspace\\tmh'os.path.join(r'D:\Workspace','tmh')將兩個(gè)路徑連接成一個(gè)路徑,即'D:\\Workspace\\tmh'。os.path.splitext(r'D:\Workspace\tmh\t7.txt')從路徑中分割出文件的擴(kuò)展名,它的返回值是一個(gè)包含兩個(gè)元素的元組('D:\\Workspace\\tmh\\t7','.txt')。6.3文件與文件夾操作【例10】下載網(wǎng)絡(luò)上的一個(gè)圖片文件。importrequests #網(wǎng)絡(luò)訪問(wèn)庫(kù),anaconda已包含此庫(kù)importos#爬取圖片時(shí)偽裝為Chrome瀏覽器,如果不偽裝,該網(wǎng)站將禁止訪問(wèn)headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.3','Accept-Language':'en-US,en;q=0.5',}url='/img/logo.png'fname=os.path.basename(url) #獲取路徑中的圖片文件名logo.pngr=requests.get(url,headers=headers) #訪問(wèn)圖片,返回一個(gè)響應(yīng)對(duì)象rwithopen(f'tmp/{fname}','wb')asfw: #'wb',圖片是二進(jìn)制文件

fw.write(r.content) #r.content對(duì)應(yīng)圖片的字節(jié)數(shù)據(jù)下載的圖片保存為tmp/logo.png文件。6.4編程實(shí)例【例11】BMI(BodyMassIndex,體質(zhì)指數(shù))是國(guó)際上常用的量度體重與身高比例的指數(shù),其計(jì)算公式為

BMI=體重(千克)/身高(米)的平方。成人的BMI數(shù)值判斷標(biāo)準(zhǔn)如下所示:過(guò)輕,低于18.5;正常,18.5~23.9;超重,24~27.9;肥胖,大于28。試編寫B(tài)MI計(jì)算程序給出相應(yīng)的判斷,并將測(cè)試結(jié)果存入BMI.txt文件。前面幾章介紹了Python編程的基本語(yǔ)法。本小節(jié)介紹幾個(gè)編程實(shí)例,大家一定要多動(dòng)手寫代碼。6.4編程實(shí)例print('BMI=體重(kg)/身高(m)的平方')f=open('tmp/BMI.txt','a+') #a+添加模式打開文件whileTrue: #循環(huán),以便反復(fù)測(cè)試

weight=float(input('體重(千克)=')) #轉(zhuǎn)浮點(diǎn)型

ifweight<=0:break #如輸入體重<=0則結(jié)束

height=float(input('身高(米)=')) bmi=round(weight/(height**2),2) #計(jì)算BMI,保留2位小數(shù)

ifbmi<18.5:s='過(guò)輕'elifbmi<=23.9:s='正常'elifbmi<=27.9:s='超重'else:s='肥胖'info=f'體重={weight}身高={height}BMI={bmi}評(píng)級(jí):{s}\n'print(info)f.write(info) #寫入文件f.close()6.4編程實(shí)例【例12】每次輸入一個(gè)數(shù)據(jù),連續(xù)輸入若干數(shù)據(jù),輸入-1時(shí)結(jié)束輸入。然后輸出數(shù)據(jù)的最大值、最小值、平均值,按升序輸出所有數(shù)據(jù)。li=[] #定義容納數(shù)據(jù)的空列表x=0whilex!=-1:x=float(input('請(qǐng)輸入一個(gè)數(shù)據(jù)(-1結(jié)束):'))ifx!=-1:li.append(x) #添加到列表中else:break #如為-1,則跳出循環(huán)iflen(li)==0: #判斷列表長(zhǎng)度print('列表為空,沒(méi)有輸入有效數(shù)據(jù)')else:print('數(shù)據(jù)個(gè)數(shù):',len(li))print('最大值:',max(li))print('最小值:',min(li))print('平均值:',sum(li)/len(li))print('升序輸出:',sorted(li))6.4編程實(shí)例【例13】猜數(shù)游戲。計(jì)算機(jī)隨機(jī)產(chǎn)生1至20之間的一個(gè)整數(shù),讓用戶猜測(cè)。計(jì)算機(jī)根據(jù)用戶輸入的數(shù)提示猜測(cè)值是偏大還是偏小,最多允許猜5次。importrandom num=random.randint(1,20) #產(chǎn)生1~20間的隨機(jī)整數(shù)k=1 #已猜測(cè)次數(shù)whilek<=5:x=int(input('請(qǐng)輸入一個(gè)[1-20]間的猜測(cè)數(shù):'))ifnum>x:print('偏小')elifnum<x:print('偏大')else:break #如猜中則跳出循環(huán)k=k+1 #次數(shù)加1ifk<=5:print('你猜對(duì)了。猜測(cè)次數(shù):',k)else:print('你沒(méi)有猜對(duì)。隨機(jī)數(shù)為:',num)6.4編程實(shí)例【例14】利用字典模擬選票計(jì)票統(tǒng)計(jì)。本例沒(méi)有實(shí)際選票數(shù)據(jù),可用隨機(jī)函數(shù)產(chǎn)生模擬選票。name是候選人名單,random.choice(name)隨機(jī)選擇一個(gè)候選人產(chǎn)生一張選票,共3000張。然后遍歷所有的選票,將每位候選人得票情況記錄在字典對(duì)象中,最后對(duì)字典的鍵值對(duì)排序。importrandom name=['甲','乙','丙','丁','甲'] #候選人名單,甲寫了兩次,隨機(jī)選中概率高vote=[] #選票列表num=3000 #選票總數(shù)forxinrange(num):vote.append(random.choice(name)) #將隨機(jī)選票加入列表di={} #空字典存放統(tǒng)計(jì)結(jié)果,統(tǒng)計(jì)后格式類似{'甲':8,'乙':3}forsinvote:#候選人姓名為鍵,該候選人票數(shù)加1

di[s]=di.get(s,0)+1#get(s,0)如候選人尚不在字典中,則初始票數(shù)為0print('總票數(shù):',num)print('未排序的結(jié)果如下:')forxindi:print(x,di[x])6.4編程實(shí)例#di.items()取出鍵值對(duì),得到類似于(("甲":8),("乙":3))的元組數(shù)據(jù)#key=lambda指定排序的匿名函數(shù),x代表類似于("甲":8)的數(shù)據(jù),則x[1]對(duì)應(yīng)票數(shù)li=sorted(di.items(),key=lambdax:x[1],re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論