版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6講
文件及操作
導(dǎo)入在python中變量和對象存儲的數(shù)據(jù)是暫時的,都在內(nèi)存中,程序結(jié)束后,數(shù)據(jù)就會丟失。有些數(shù)據(jù)可能是經(jīng)過較長計算得來的,如果丟失,則需要花很長時間來重新計算。長時間地保存程序中的數(shù)據(jù),需要將程序中的數(shù)據(jù)保存到磁盤文件中。不僅僅是數(shù)據(jù),通過序列化,我們還能將對象轉(zhuǎn)換成字節(jié)序列,保存起來,再需要用時,通過反序列化還原對象。python內(nèi)置了文件對象和對文件、目錄進行操作的模塊,通過這些模塊可以方便、快捷的將數(shù)據(jù)保存到磁盤文件中,以達到長時間保存數(shù)據(jù)的目的。主要內(nèi)容掌握文件的讀寫熟悉文件指針熟悉os及os.path模塊了解pillow模塊了解openpyxl模塊6.1文件概述文件,即存儲在計算機上的信息集合。應(yīng)用程序可以通過文件共享數(shù)據(jù)。程序可以通過文件讀取信息,例如文字、表格、圖像、聲音等信息,也可以將信息記錄在文件當(dāng)中儲存起來。根據(jù)文件的數(shù)據(jù)組織形式,文件可以分為文本文件和二進制文件。1.文本文件文本文件存儲的是普通的字符串,每個字符一般是定長的(也有不固定長度的編碼utf-8),ASCII碼是8個比特的編碼,UNICODE一般占16個比特。基于字符,每個字符在具體編碼中是固定的。文本文件可以用普通記事本或其他文本編輯器打開和編輯并且我們是能看得懂的。簡單來說,文本文件是基于字符編碼的文件,我們在保存或者打開文本文檔時可以查看以及修改相應(yīng)的編碼方式。2.二進制文件
二進制文件把數(shù)據(jù)以字節(jié)串(btype)進行儲存。二進制文件數(shù)據(jù)長度是靈活可變的,存儲利用率要高。常見的圖形圖像文件、音視頻文件、Office文檔等都屬于二進制文件。普通文本編輯器不能對二進制文件進行正常讀寫。簡單來說二進制文件是基于值編碼的文件,你可以根據(jù)具體應(yīng)用,指定某個值(可以看作是自定義編碼)。我們管理存放存放文件的目錄系統(tǒng)叫做文件夾,一般計算機采用的是樹狀目錄結(jié)構(gòu)。表示文件位置顯示的一系列文件夾序列稱為路徑。6.2打開文件我們在操作文件之前,必須先打開文件。python中通過內(nèi)建函數(shù)open打開文件,open函數(shù)成功打開文件之后會返回一個文件對象,否則引發(fā)一個錯誤,當(dāng)操作失敗的時候,會拋出異常,基本語法如下:File_object=open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)說明:這里著重介紹file、mode、buffering和encoding參數(shù),其余參數(shù)用的較少,同學(xué)可以通過help(open)命令查看其余參數(shù)的作用。file參數(shù)不僅可以接受字符串文件路徑,還可以接受文件描述符(filedescriptor)。文件路徑可以是絕對路徑或者是相對路徑,但建議使用絕對路徑來提高程序的穩(wěn)定性。mode表示為文件打開的模式,經(jīng)常使用的模式有r,w,a,分別表示為讀取,寫入,追加,其他模式見表6-1,如果沒有使用mode參數(shù),那么默認為只讀的r模式。buffering參數(shù)設(shè)置緩沖行為,它有三種模式,分別是全緩沖、行緩沖和無緩沖。當(dāng)buffering=a(a為正整數(shù)但不包括1)時,表示全緩沖,當(dāng)緩沖區(qū)大小達到a字節(jié)時寫入磁盤。當(dāng)buffering=1時,表示行緩沖,當(dāng)緩沖區(qū)遇到換行符\n時寫入磁盤。當(dāng)buffering=0時,表示無緩沖,內(nèi)容直接寫入磁盤。如果沒有使用buffering參數(shù),那么默認為全緩沖。encoding參數(shù)是指明文件編碼,僅適用于文本文件,如果沒有使用encoding參數(shù),默認是使用locale.getpreferredencoding()函數(shù)返回的編碼方式。6.2打開文件模式描述x寫模式,新建一個文件并且可以寫入,如果該文件已存在則會報錯。rb二進制打開只讀模式。r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。r+打開一個文件用于讀寫。打開文件時文件指針將會放在文件的開頭。不會清空原有內(nèi)容,而是會在文件開頭寫入內(nèi)容。w打開一個文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內(nèi)容會被清空。如果該文件不存在,創(chuàng)建新文件。w+打開一個文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內(nèi)容會被刪除。如果該文件不存在,創(chuàng)建新文件。a打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結(jié)尾。即新的內(nèi)容將會被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件進行寫入。a+打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結(jié)尾。文件打開時會是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。表6-1open函數(shù)中文件打開模式6.2打開文件之前我們說到,open函數(shù)成功打開文件之后會返回一個文件對象,下面介紹文件對象的常用方法,如表6-2所示。表6-2操作文件對象的常用方法方法功能close(self)關(guān)閉文件。關(guān)閉后文件不能再進行讀寫操作。flush(self)刷新文件內(nèi)部緩沖,直接把內(nèi)部緩沖區(qū)的數(shù)據(jù)立刻寫入文件,而不是被動的等待輸出緩沖區(qū)寫入。fileno(self)返回一個整型的文件描述符(filedescriptorFD整型),可以用在如os模塊的read方法等一些底層操作上。isatty(self)如果文件連接到一個終端設(shè)備返回True,否則返回False。read(self,size=-1)讀取文件內(nèi)容,并返回字符串/字節(jié)串對象。size為可選參數(shù)。省略size,size值為負數(shù)或者size大于文件總字符數(shù)/總字節(jié)數(shù)時讀取整個文件的內(nèi)容。size取其他值時讀取size個字符/字節(jié)。readline(self,size=-1)讀取文本直到換行符或者文本結(jié)束。size是可選參數(shù),表示指定的字符數(shù)或者字節(jié)數(shù)。如果size大于單行字符數(shù)/字節(jié)數(shù)或為負數(shù)則最多只能讀取這一行的內(nèi)容。readlines(self,hint=-1)按行讀取內(nèi)容。默認hint=-1讀取所有行并返回列表??梢灾付╤int來控制讀取的行數(shù):如果到目前為止所有行的總大?。ㄒ宰止?jié)/字符為單位)超過了hint,將不再讀取更多行。seek(self,cookie,whence=0)更改文件指針的當(dāng)前位置tell(self)返回文件指針當(dāng)前位置。truncate(self,pos=None)截取文件,截取的字節(jié)通過size指定,默認為當(dāng)前文件位置。write(self,text)將字符串寫入文件,返回的是寫入的字符長度。writelines(self,lines)向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。6.3文本文件的操作1.文本文件的編碼我們已經(jīng)知道,文本文件是基于字符編碼的文件,常用的文本文件編碼格式有ANSI、UTF-16LE、UTF-16BE、UTF-8和帶BOM的UTF-8等。通常,文件以文本文本模式打開,從文件中讀取或者寫入字符串時,都以指定編碼方式進行編碼。如未指定編碼格式,默認值與平臺相關(guān),可以使用locale.getpreferredencoding()函數(shù)查看默認編碼。在打開文本文件時需要使用正確的文件編碼,如果使用的編碼方式不匹配,可能就會出現(xiàn)解碼錯誤問題。【例6-1】用GBK編碼的方式打開GBK文本文件。>>>a=open("c:/demo.txt",'r',encoding='GBK')>>>a.read()'你好,世界'【例6-2】用utf-8編碼的方式打開GBK文本文件。>>>a=open("c:/demo.txt",'r',encoding=’utf-8’)>>>a.read()Traceback(mostrecentcalllast):UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xc4inposition0:invalidcontinuationbyte6.3文本文件的操作說明1.
“c:/demo.txt”
為文件路徑,‘r’
表示以只讀方式打開文件,encoding=‘GBK‘
表示使用‘GBK’的方式打開文本文件。(文件路徑及文本文件內(nèi)如圖所示)2.【例6-1】使用匹配的編碼方式打開文本文件,可以正常讀取文件內(nèi)容。3.
【例6-2】使用不匹配的編碼方式打開文本文件時,文件依舊能打開,并沒有在執(zhí)行open函數(shù)時報錯,但在執(zhí)行文件對象中的read()方法時出現(xiàn)了錯誤,可以看到用utf-8編碼去解碼GBK編碼的文本文件,編碼不匹配時,出現(xiàn)了UnicodeDecodeError錯誤。6.3文本文件的操作2.文本文件的讀取python中可以使用文件對象的read、readline和readlines方法對文件內(nèi)容進行讀取。這些方法的用法可以參照表6-2。需要注意的是,這些方法讀取的數(shù)據(jù)輸出都是變?yōu)樽址男问剑绻瓉淼奈谋疚募泻袛?shù)字,需要我們進行數(shù)據(jù)類型轉(zhuǎn)換。下面我們通過一些具體的代碼對這些方法進行演示。6.3文本文件的操作【例6-3】使用read方法讀取文件內(nèi)容。在文本文件read_demo.txt已有內(nèi)容:’123\n123\n123’。>>>f=open('read_demo.txt')#打開文件>>>print(f.read())#參數(shù)為空,讀取所有數(shù)據(jù),返回字符串123123123>>>f.seek(0)#將文件指針定位到文件開頭0>>>print(f.read(6))#讀取6個字符12312#包含換行符’\n’>>>f.seek(0) 0>>>print(f.read(15))
#設(shè)置size大于文件總字符數(shù)123123123>>>f.seek(0)0>>>get=int(f.read(3)) #將字符串‘123’轉(zhuǎn)為整型>>>print(get+1) #進行加法運算1246.3文本文件的操作說明1.
說明1.
read(self,
size=-1)方法功能為讀取文件內(nèi)容,并返回字符串/字節(jié)串對象。2.
size為可選參數(shù)。省略size,size值為負數(shù)或者size大于文件總字符數(shù)/總字節(jié)數(shù)時讀取整個文件的內(nèi)容。size取其他值時讀取size個字符/字節(jié)。3.
seek(self,cookie,whence=0)
方法功能為改變文件指針的當(dāng)前位置,在例子中通過f.seek(0),將文件指針定位到文件的開頭。
6.3文本文件的操作【例6-4】使用readline方法讀取文件內(nèi)容。在readline_demo.txt中已有內(nèi)容:’Thisisthefirstline.\nThisisthesecondline.\nThisisthethirdline.’。>>>f=open('readline_demo.txt')>>>print(f.readline())
#參數(shù)為空,第一次讀取到換行符Thisisthefirstline.
>>>print(f.readline(16))Thisistheseco>>>print(f.readline())
#參數(shù)為空,讀取到第二個換行符ndline.>>>print(f.readline(100))Thisisthethirdline.>>>print(f.readline())
#返回內(nèi)容為空,表示到了文件末尾說明1.readline(self,size=-1)
方法功能為讀取讀取文本直到換行符或者文本結(jié)束。2.
size是可選參數(shù),表示指定的字符數(shù)或者字節(jié)數(shù)。如果size大于單行字符數(shù)/字節(jié)數(shù)或為負數(shù)則最多只能讀取這一行的內(nèi)容。3.
readline方法從文件中讀取單行數(shù)據(jù),字符串末尾保留換行符’\n’,只要f.readline()返回空字符串,就表示已經(jīng)到達了文件末尾。6.3文本文件的操作【例6-5】使用readlines方法讀取文件內(nèi)容。readlines_demo.txt文件中已有文本’Hello,World.\nHello,Python.\nHi,World.\nHi,Python’>>>f=open('readlines_demo.txt')>>>print(list(f))#使用list函數(shù)讀取文件中的所有行并以列表形式返回['Hello,World.\n','Hello,Python.\n','Hi,World.\n','Hi,Python']>>>f.seek(0)#將文件指針定位到文件開頭0>>>print(f.readlines())#參數(shù)為空,默認hint=-1讀取所有行并返回列表['Hello,World.\n','Hello,Python.\n','Hi,World.\n','Hi,Python']>>>f.seek(0)0>>>print(f.readlines(6))['Hello,World.\n']#第一行的字符長度超過了6,輸出第一行且將不再讀取更多行>>>f.seek(0)0>>>print(f.readlines(16))#第一行的字符長度不足16,加上第二行超過16,故輸出第一行和第二行內(nèi)容。['Hello,World.\n','Hello,Python.\n']>>>f.seek(0)0>>>print(f.readlines(50))['Hello,World.\n','Hello,Python.\n','Hi,World.\n','Hi,Python']#hint大于所有數(shù)據(jù)的長度,輸出所有數(shù)據(jù)6.3文本文件的操作說明1.
說明1.
readlines(self,hint=-1)方法功能為按行讀取內(nèi)容,并返回列表。2.默認hint=-1讀取所有行并返回列表??梢灾付╤int來控制讀取的行數(shù):如果到目前為止所有行的總大?。ㄒ宰止?jié)/字符為單位)超過了hint,將不再讀取更多行。3.如需以列表形式讀取文件中的所有行,可以用list函數(shù)或文件對象中的readlines方法。6.3文本文件的操作3.文本文件的寫入python提供了兩種方法讓我們能夠?qū)ξ谋具M行寫入,一是文件對象中的write或writelines方法,二是使用print()函數(shù)。使用write及writelines方法寫入文件之前介紹的文本文件讀取方法中我們有說到,read和readline返回的是一個字符串,在使用write和writelines方法寫入文件時,我們需要注意的是也需要將數(shù)據(jù)轉(zhuǎn)變?yōu)樽址袷讲趴梢詫懭搿?.3文本文件的操作(1)write方法先來看個簡單例子:【例6-6】寫入文本文件>>>f=open('text_demo.txt','w')>>>f.write('HelloWorld!')12>>>f.close()#關(guān)閉文件>>>f=open('text_demo.txt','r')>>>print(f.read())HelloWorld!>>>f.close()#關(guān)閉文件>>>f=open('text_demo.txt','w')#再次用'w'模式打開文件>>>f.write('HelloWorld!')#向文件中寫入'HelloWorld!'12>>>f.close()#關(guān)閉文件>>>f=open('text_demo.txt','r')>>>print(f.read())HelloWorld!
說明1.使用write()方法往demo.txt中寫入了“HelloWorld!”文本,關(guān)閉后又使用’r’讀取,輸出了“HelloWorld!”。2.用同樣的方法向text_demo.txt文件中寫入“HelloWorld!”并關(guān)閉,然后再次讀取發(fā)現(xiàn)文件中依舊也只有一條“HelloWorld!”3.因為使用‘w’模式重新打開文件后,之前文件中的內(nèi)容會被全部都被清空,所以如果想在不清空之前內(nèi)容的基礎(chǔ)上繼續(xù)寫入,那就需要用到追加模式‘a(chǎn)’。6.3文本文件的操作【例6-7】使用追加模式寫入內(nèi)容。此時text_demo.txt中已有內(nèi)容'HelloWorld!'。>>>withopen('text_demo.txt','a')asf:#追加模式 f.write('HelloWorld!')
12>>>withopen('text_demo.txt','r')asf: print(f.read())
HelloWorld!HelloWorld!說明1.使用追加模式向text_demo.txt中追加“Hello
World!”2.輸出文本中的內(nèi)容只有一行內(nèi)容,是因為我們沒有加上換行符。6.3文本文件的操作(2)writelines方法由于write方法一次只能添加一個字符串,如果實現(xiàn)多個字符串的寫入,就需要我們重復(fù)調(diào)用write方法。為了避免這種重復(fù)的麻煩,我們可以使用writelines方法將多個字符串寫入文件當(dāng)中去。6.3文本文件的操作【例6-8】writelines方法>>>string1='Python\n'>>>string2='Is\n'>>>string3='A\n'>>>string4='Good\n'>>>string5='Lauguage\n'>>>f=open('writelines_demo.txt','w')>>>f.writelines([string1,string2,string3,string4,string5])>>>f.close()
>>>f=open('writelines_demo.txt')>>>print(f.read())PythonIsAGoodLauguage說明1.在使用write和writelines方法向文件寫入內(nèi)容時python不會自動添加換行符,所以在輸入的時候必須自己添加換行符’\n’。6.3文本文件的操作print函數(shù)寫入文件在IDLE窗口輸入help(‘print’)我們可以查看有關(guān)print函數(shù)的介紹:…print(value,...,sep='',end='\n',file=sys.stdout,flush=False)…它是我們常用的輸出函數(shù),同時也可以用來寫入文件。print函數(shù)中的參數(shù)file表示我們要寫入的文件,默認為標準的輸出端。sep表示在值之間插入的字符串,默認為空格。end表示在最后一個值之后附加的字符串,默認為換行符。print方法支持我們往文件里寫入非字符串的數(shù)據(jù)類型。6.3文本文件的操作【例6-9】使用print函數(shù)往print_demo.txt寫入兩句”HelloWorld!”:>>>f=open('print_demo.txt','w')>>>print('Hello,World!',file=f)>>>print('Hello,World!',file=f)>>>f.close()>>>f=open('print_demo.txt')>>>print(f.read())Hello,World!Hello,World!
說明1.我們可以看到前兩個print函數(shù)在調(diào)用時是直接將內(nèi)容寫入文件當(dāng)中,而不會將它打印出來。2.其實,print()函數(shù)還支持將多個數(shù)據(jù)一起寫入文件,中間用逗號隔開,默認情況下寫入文件后會自動在寫入數(shù)據(jù)之間留有空格,最后會添加一個換行符,我們也可以通過sep和end參數(shù)來控制值之間的字符串以及附加字符串。6.3文本文件的操作【例6-9】使用print函數(shù)寫入多條數(shù)據(jù)>>>string='Iloveyou'>>>num=1314#寫入整數(shù)類型>>>f=open('demo.txt','w')>>>print(string,num,string,num,end=’?’file=f)#設(shè)置附加字符串為’?’>>>f.close()>>>f=open('demo.txt')>>>print(f.read())Iloveyou1314Iloveyou1314?
說明1.默認的分隔符為空格,所以每條數(shù)據(jù)之間由空格隔開2.附加字符串為“?”,所以在輸入所有數(shù)據(jù)后再數(shù)據(jù)末尾添加了附加字符串“?”6.4文件指針文件指針之前其實已經(jīng)接觸過了,它與文件的讀寫操作有關(guān)。文件指針的位置總是停留在上一次操作結(jié)束后的位置。如果我們想要在指定位置進行讀寫操作,就需要移動指針到需要的位置。tell方法返回一個整數(shù),表示文件指針當(dāng)前的絕對位置。seek方法用來更改文件指針的位置,返回新的絕對位置。seek方法語句:seek(self,cookie,whence=0),其中cookie表示將文件指針位置更改為給定的字節(jié)偏移量。偏移量是相對于whence所指示的位置進行偏移。whence是可選參數(shù),用來表示從哪個位置開始偏移。若以只讀模式打開,一共含有三個參數(shù),0表示從文件開頭開始算起,1表示從當(dāng)前位置開始算起,2表示從文件末尾開始算起。默認值為0。6.4文件指針【例6-10】tell和seek方法示例。seek_demo.txt中原有文本為“Hello\nworld”。我們在IDLE中輸入:>>>f=open('seek_demo.txt')>>>print(f.tell())0>>>print(f.readline())hello>>>f.tell()6>>>f.seek(0,1)6#whence參數(shù)為1,表示相對當(dāng)前位置偏移0字節(jié),即未進行偏移
>>>f.seek(0)0 #whence參數(shù)為空,相對于文件開頭位置偏移0字節(jié),文件指針停留在文件開頭>>>print(f.readline())hello>>>print(f.readline())world>>>f.close()說明1.在第一次操作后文件指針停留在了第一行讀寫后的下一個位置。2.我們可以通過seek方法回溯到文件開頭的位置。6.5二進制文件的操作二進制模式打開、讀取文件在模式中’b’代表用二進制模式打開文件,此時,數(shù)據(jù)以字節(jié)對象的形式進行讀寫。因此’rb’模式是將文件內(nèi)容以二進制模式打開并讀取。【例6-11】二進制模式打開文件。假設(shè)binary_demo.txt已有文本”你好!”。>>>f=open(‘binary_demo.txt’,’rb’)>>>print(f.read(2))#讀取兩個字節(jié)b'\xc4\xe3'>>>f.seek(0)0
>>>print(f.read())b'\xc4\xe3\xba\xc3!'>>>f.close()>>>f=open('binary_demo.txt','r')>>>print(read(2)) #讀取兩個字符你好
6.5二進制文件的操作從文件寫入或讀取字符串很簡單,數(shù)字則稍顯麻煩,因為read方法只返回字符串,我們必須使用int等這類函數(shù)來進行強制數(shù)據(jù)類型轉(zhuǎn)換,接受'123'這樣的字符串,并返回數(shù)字值123。在保存嵌套列表、字典等復(fù)雜數(shù)據(jù)類型時,手動解析和序列化的操作非常復(fù)雜。下面我們將要介紹的的模塊采用python數(shù)據(jù)層次結(jié)構(gòu),可以將對象轉(zhuǎn)換為字節(jié)序列,這個過程稱為序列化(serializing)。從字節(jié)序列重建數(shù)據(jù)稱為反序列化(deserializing)。使用pickle模塊讀寫二進制文件python標準庫pickle提供的dump函數(shù)用于將數(shù)據(jù)進行序列化并寫入文件,而load函數(shù)用于將文件內(nèi)容進行反序列化,還原為原來的信息。6.5二進制文件的操作【例6-12】使用pickle模塊中的dump函數(shù)序列化。>>>importpickle>>>f=open('pickle_demo.txt','wb')>>>pickle.dump([1,
2,
3],
f)>>>f.close()【例6-13】使用pickle模塊中的load函數(shù)反序列化。>>>importpickle>>>f=open('pickle_demo.txt','rb')>>>print(type(pickle.load(f)))<class'list'>>>>f.seek(0)0>>>print(pickle.load(f))[1,2,3]>>>f.close()說明:1.
【例6-12】中我們以二進制寫入模式打開文件‘pickle_demo.txt‘,并使用dump函數(shù)將列表對象轉(zhuǎn)換為字節(jié)序列,寫入文件中。2.【例6-13】中我們以二進制只讀模式打開文件‘pickle_demo.txt‘,并將里面的內(nèi)容反序列化,可以看到讀取內(nèi)容的類型并不是字符串,而是將列表。3.通過序列化與反序列化,使我們能夠持久化保存的數(shù)據(jù)不僅僅是字符串,還可以是對象。6.6關(guān)閉文件在前面章節(jié)中,對于使用open()函數(shù)打開的文件,我們一直都在用文件對象中的close方法將其關(guān)閉。本節(jié)就來詳細介紹一下close方法。我們使用完文件后,應(yīng)當(dāng)關(guān)閉文件,釋放文件資源,避免文件中的數(shù)據(jù)丟失。關(guān)閉文件的一般語法格式為:文件對象.close()。為什么說關(guān)閉文件是必要的,因為不關(guān)閉文件除了有可能造成數(shù)據(jù)丟失外,我們的程序還有可能因為另外一個程序占用而報錯。6.6關(guān)閉文件【例6-16】關(guān)閉文件
>>>importos>>>f=open('close_demo.txt','w',newline='\n')#newline參數(shù),設(shè)置換行符>>>f.write('hello\nworld')11>>>os.remove('close_demo.txt')#刪除文件,之后會講到PermissionError:[WinError32]另一個程序正在使用此文件,進程無法訪問。:'close_demo.txt'>>>f.close()>>>os.remove('close_demo.txt')說明:1.顯然,因為我們沒有及時關(guān)閉close_demo.txt文件而導(dǎo)致做刪除文件時出現(xiàn)了錯誤。當(dāng)我們關(guān)閉文件以后,才可以將文件進行刪除等其他操作。
6.7使用with關(guān)鍵字處理文件對象
當(dāng)我們使用open函數(shù)打開文件時,需要我們自己調(diào)用close方法關(guān)閉文件,不然就有可能造成寫入的數(shù)據(jù)丟失,這是非常痛苦的,因此我們需要一種更加方便保險的方法,那就是使用with關(guān)鍵字。使用with關(guān)鍵字處理文件對象的好處在于,不需要調(diào)用close來關(guān)閉文件防止數(shù)據(jù)丟失。即使觸發(fā)異常文件也會正常關(guān)閉。使用with關(guān)鍵字與open()方法類似,同樣可以設(shè)置buffering,encoding等參數(shù)。我們也可以使用with關(guān)鍵字嵌套讀寫多個文件。6.7使用with關(guān)鍵字處理文件對象【例6-17】使用with關(guān)鍵字處理文件。>>>foriinrange(5): withopen('demo_1.txt','a')asf1: withopen('demo_2.txt','a')asf2: f1.write(str(i)+'') f2.write(str(i+1)+'')>>>withopen('demo_1.txt')asf1: withopen('demo_2.txt')asf2: print(f1.read()) print(f2.read())
0123412345>>>os.remove('demo_1.txt')>>>os.remove('demo_2.txt')說明:1.我們在使用with構(gòu)造一個對象以后,python會調(diào)用這個對象的__enter__方法,with語句塊執(zhí)行結(jié)束后,會自動調(diào)用__exit__方法關(guān)閉文件,因此使用with語句來讀寫文件更加保險。
2.我們用open函數(shù)打開文件時,沒有關(guān)閉文件可能導(dǎo)致數(shù)據(jù)丟失的原因是操作系統(tǒng)會將你要寫入的數(shù)據(jù)放到內(nèi)存里緩存起來,即存放在緩沖區(qū),不會立刻把全部數(shù)據(jù)寫入磁盤。雖然我們可以通過設(shè)置緩沖區(qū)為0來避免這個問題,但還有其他問題我們需要考慮,比如文件資源被占用等等。6.8文件操作相關(guān)模塊文件級操作
os和os.path模塊是python自帶的模塊,通過導(dǎo)入該模塊可以實現(xiàn)如刪除某文件、查看文件夾內(nèi)文件,更改工作目錄和對計算機系統(tǒng)進行操作。可以通過help(’os’)和help(’os.path’)命令查看這些模塊的詳細介紹。文件操作常用函數(shù)如下表所示。6.8文件操作相關(guān)模塊函數(shù)描述os.remove(filename)指定file路徑刪除文件fileos.path.abspath(filename)返回文件所在的路徑名稱os.path.exists(filename)判斷文件filename是否存在,若存在返回True,若不存在返回Falseos.rename(old,new)重命名文件或者目錄os.path.stat(filename)返回文件的所有屬性os.path.getatime(filename)返回文件的最后訪問時間os.path.getmtime(filename)返回文件的最后修改時間os.path.getsize(filename)返回文件的大小os.path.isfile(path)判斷path是否為文件os.listdir(path)返回path路徑下所有的文件的文件名組成的列表6.8文件操作相關(guān)模塊【例6-18】部分文件級操作示例。>>>importos>>>importos.path>>>os.rename('c:/demo_1.txt','c:/demo.txt')#重命名文件>>>os.remove('c:/demo.txt')#刪除demo.txt文件,沒有返回值>>>print(os.path.exists('c:/demo.txt'))#返回布爾值True或False,判斷文件是否存在False雖然文件級的函數(shù)較多,但使用方法較為簡單,更多的函數(shù)的使用,可以課后一一嘗試。6.8文件操作相關(guān)模塊目錄級操作除了支持文件級的操作,os和os.path模塊還提供了大量目錄級的操作函數(shù),常用函數(shù)如下表所示。函數(shù)描述os.getcwd()返回當(dāng)前python程序運行的工作路徑os.chdir(path)改變工作路徑為path返回用戶使用操作系統(tǒng)的類型,windows系統(tǒng)得到返回值是‘nt’,Unix、Linux(含Android)返回的是’posix’os.system(command)執(zhí)行command給出的shell命令。例如IDLE輸入命令os.system(‘calc’)會打開計算器,輸入os.system(‘cmd’)則會打開command命令窗口os.mkdir(path)創(chuàng)建目錄os.rmdir(path)刪除在path目錄下的空文件夾os.walk(top,topdown=True,onerror=None)遍歷目錄樹,該方法返回一個元組,包括三個元素:所有路徑名、所有目錄列表與文件列表6.8文件操作相關(guān)模塊【例6-20】部分目錄級操作示例。>>>importos>>>importos.path>>>os.rmdir('E:\\test')#若test為空文件夾,則刪除,若test非空則會報錯。即os.rmdir(path)只能刪除空目錄>>>os.mkdir('D:\\test\\demo')#若test目錄下沒有demo文件夾,則創(chuàng)建該文件夾,若demo文件夾已存在,則會報錯>>>print(os.path.abspath('demo.txt'))#返回demo.txt所在文件的目錄更多的函數(shù)的使用,可以課后一一嘗試。6.9文件操作的其他模塊除了python自帶的文件處理模塊,還可以下載第三方的文件處理模塊進行文件處理,比如pillow模塊,可以用于處理圖像文件,openpyxl模塊可以處理excel文件,下面簡單介紹這兩種模塊
使用pillow模塊處理圖像
pillow模塊是PIL模塊的一個分支,能夠支持加載圖像文件,或者對圖像文件進行處理以及創(chuàng)建圖像等操作。我們可以通過命令:pipinstallpillow命令下載這個模塊,一般使用fromPILimportImage語句導(dǎo)入這個模塊。感興趣的同學(xué)可以深入了解一下它們的用法。6.9文件操作的其他模塊我們使用Image.open()方法加載一個圖像文件,此方法返回一個圖像對象。圖像對象常用方法如下表所示。方法功能show()顯示圖像對象save()保存文件crop([left,up,right,down])返回從圖像復(fù)制的子矩形thumbnail(size)創(chuàng)建縮略圖split()返回三個波段數(shù)值,表示RGB顏色值filter(ImageFilter.BLUR)模糊濾鏡resize(size)對圖像文件設(shè)置新的大小rotate(degree)逆時針旋轉(zhuǎn)對應(yīng)角度convert(mode)在指定模式下進行顏色轉(zhuǎn)換6.9文件操作的其他模塊【例6-21】使用pillow實現(xiàn)圖像縮放??s放前后如圖6-1和6-2所示。>>>fromPILimportImage>>>im=Image.open('pillow_demo.jpeg')#打開圖像文件>>>w,h=im.size#獲取原圖像尺寸大小>>>print(w,h)500498>>>im.thumbnail((w//2,h//2))#原圖像縮放50%>>>print('resizeimage:%s,%s'%(w//2,h//2))resizeimage:250,249>>>im.save('resize_demo.jpeg','jpeg')#以jpeg方式保存6.9文件操作的其他模塊【例6-22】使用pillow實現(xiàn)圖像模糊效果。模糊前后如圖6-3和6-4所示。>>>fromPILimportImage,ImageFilter>>>im=Image.open('pillow_demo.jpeg')>>>new_im=im.filter(ImageFilter.BLUR)#應(yīng)用模糊濾鏡>>>new_im.save('blur_demo.jpeg','jpeg')6.9文件操作的其他模塊使用openpyxl模塊處理excel文件本書使用opencpyxl模塊處理excel文件,它不是python自帶的模塊,需要我們使用pipinstallopenpyxl命令安裝后使用。需要注意的是openpyxl只支持.xlsx、.xlsm、.xltx和.xltm格式的文件,如果要處理.xls等其他不支持的文件格式,可以將文件另存為上述支持的文件格式,或者使用其他模塊處理該類型文件。6.9文件操作的其他模塊openpyxl模塊中的常用函數(shù)和方法如下表所示。函數(shù)、方法功能openpyxl.load_workbook(filename)打開已有excel文件并返回workbook對象openpyxl.Workbook()新建一個workbook對象并返回workbook.index(worksheet)輸入worksheet對象,返回該工作表的索引workbook.remove(worksheet)從該文件中刪除worksheet工作表workbook.create_sheet(self,title=None,index=None)創(chuàng)建工作表并返回worksheet對象,title為工作表名稱,index為工作表索引,默認為Noneworkbook.sav
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政審批工作流程優(yōu)化方案
- 電梯安裝施工方案
- 大型超市庫存盤點及損耗管理方案
- 天津某鐵水倒罐站地下連續(xù)墻工程施工方案
- 汽車維修高級技能實訓(xùn)方案
- 幼兒園教學(xué)活動計劃及實施方案
- 成人繼續(xù)教育課程設(shè)計與實施方案
- 企業(yè)營銷策略優(yōu)化執(zhí)行方案表
- 風(fēng)險評估及預(yù)防應(yīng)對方案模板
- 民宿運營顧客服務(wù)方案范本
- 新高考語文專題訓(xùn)練之模擬題分類匯編文言文閱讀1(原卷版+解析)
- DL∕T 5545-2018 火力發(fā)電廠間接空冷系統(tǒng)設(shè)計規(guī)范
- 《研學(xué)旅行課程設(shè)計》課件-研學(xué)課程設(shè)計原則
- JJG 693-2011可燃氣體檢測報警器
- (本科)大學(xué)生勞動教育理論與實踐教程全書電子教案完整版
- 黑龍江省中藥飲片炮制規(guī)范及標準
- 盤口暗語及盤口數(shù)字語言
- QC-提高衛(wèi)生間防水一次驗收合格率
- 彈藥庫防火防爆消防演示
- 大地測量控制點坐標轉(zhuǎn)換技術(shù)規(guī)程
- 食材配送服務(wù)方投標方案(技術(shù)標)
評論
0/150
提交評論