Python程序設(shè)計基礎(chǔ)第七章 訪問文件_第1頁
Python程序設(shè)計基礎(chǔ)第七章 訪問文件_第2頁
Python程序設(shè)計基礎(chǔ)第七章 訪問文件_第3頁
Python程序設(shè)計基礎(chǔ)第七章 訪問文件_第4頁
Python程序設(shè)計基礎(chǔ)第七章 訪問文件_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯報人:WPSPython程序設(shè)計基礎(chǔ)第七章訪問文件目錄01文件的使用流程02文件的讀寫操作03Python生態(tài)系統(tǒng)之os庫04小試牛刀目錄05拓展實踐:根據(jù)訂單數(shù)據(jù)生成銷售報告06本章小結(jié)理解文件的作用。掌握文件使用的流程。掌握文本文件的讀取與寫入方法。了解

os庫的使用。前面雖然介紹了很多數(shù)據(jù)結(jié)構(gòu)來保存數(shù)據(jù),但都是在內(nèi)存中,因此無法實現(xiàn)長期持久的保存數(shù)

據(jù)。要達到這一目標,就需要使用文件。本章介紹使用文件的基本流程,以及如何讀寫文本文件。學(xué)習目標PART17.1文件的使用流程相信讀者已經(jīng)習慣了程序要有變量,有各種類型的容器來保存數(shù)據(jù)。簡單如整型、浮點型、字

符串,復(fù)雜點的如列表、元組和字典等。但所有這些變量容器都是在內(nèi)存中的,內(nèi)存的弱點是一旦

意外關(guān)機、斷電,保存其中的數(shù)據(jù)就都沒有了。因此如果程序想要持久保存數(shù)據(jù)就需要使用文件。

文件一般位于磁盤上,磁盤是永久性保存數(shù)據(jù)的媒介,即使斷電也不會丟失數(shù)據(jù)。因此現(xiàn)實世界的

程序都需要有訪問磁盤文件的能力。7.1.1使用文件的原因Python

內(nèi)置的

open()函數(shù)可以打開磁盤上的文件,打開方式可以是讀取、寫入或二者均可。對

于文本文件,open()函數(shù)還可以指定使用何種編碼方式打開目標文件。按照面向?qū)ο蟮睦砟?,文件?/p>

開后open()函數(shù)會返回一個代表該文件的對象,這個文件對象具有很多操作文件的方法,調(diào)用文件

對象的這些方法就可以方便地操作文件了。例如,

假設(shè)文件對象叫

file_obj,則關(guān)閉這個文件的操作

可以通過

file_obj.close()方法來完成。文件使用完畢后一定要記得關(guān)閉,這是每次使用完文件必做的收尾工作。因為當文件被

open()

函數(shù)打開時,這個文件就被程序獨享占用,操作系統(tǒng)會保證其他的程序無法使用這個文件。如果

程序用完文件但不關(guān)閉,則程序?qū)ξ募莫毾碚加镁腿匀怀掷m(xù)著,導(dǎo)致其他程序無法正常使用該

文件。使用文件的基本流程如下。第一步,使用

open()函數(shù)打開文件,得到一個文件對象。第二步,調(diào)用文件對象的方法對文件進行讀寫操作。第三步,關(guān)閉文件。7.1.2使用文件的方法內(nèi)置的open()函數(shù)擁有多個參數(shù),但常用的只有幾個。下面通過打開一個文本文件的例子演示

open()函數(shù)的使用細節(jié)。代碼

7.1

要求磁盤上和代碼文件相同目錄下有

file

文件夾,file

文件夾下有“長信宮燈.txt”文件。代碼

7.1

使用

open

函數(shù)打開文件7.1.3open()函數(shù)的使用#file_obj=open("file/長信宮燈.txt","r",encoding="utf-8")#亦可file_obj=open("file\\長信宮燈.txt","r",encoding="utf-8")forline

in

file_obj:print(line)file_obj.close()這段代碼打開指定的文本文件并將其中的內(nèi)容輸出,之后關(guān)閉文件。代碼

7.1

的運行結(jié)果如下。長信宮燈一改以往青銅器皿的神秘厚重,整個造型及裝飾風格都顯得舒展自如、輕巧華麗,是一件既實用、又美觀的燈

具珍品。宮女銅像體內(nèi)中空,其中空的右臂與衣袖形成銅燈燈罩,可以自由開合,燃燒產(chǎn)生的灰塵可以通過宮女的右臂沉積

于宮女體內(nèi),不會大量飄散到周圍環(huán)境中,其環(huán)保理念體現(xiàn)了古代中國人民的智慧,長信宮燈被譽為“中華第一燈”。美國前國務(wù)卿基辛格來華訪問時曾參觀過長信宮燈,并感慨道:“2000

多年前中國人就懂得了環(huán)保,真了不起?!遍L信宮燈一直被認為是中國工藝美術(shù)品中的巔峰之作和民族工藝的重要代表而廣受贊譽。這不僅在于其獨一無二、稀有

珍貴,更在于它精美絕倫的制作工藝和巧妙獨特的藝術(shù)構(gòu)思。采取分別鑄造,然后合成一整體的方法。考古學(xué)和冶金史的研

究專家一致公認,此燈設(shè)計之精巧,制作工藝水平之高,在漢代宮燈中首屈一指。1993

年被鑒定為國寶級文物。摘自《百度百科》代碼中的

open()函數(shù)用到了

3個參數(shù),分別如下。(

1)參數(shù)

file:待打開的文件名。open()函數(shù)的第一個參數(shù)是要打開的文件名,如果文件不在當前路徑還要有路徑名。其中的路徑

分隔符在

Windows平臺下使用的是“\”,與

Python

的字符串轉(zhuǎn)義符號沖突了。因此如果想要使用

“\”作為路徑分隔符,則每個分隔路徑的斜杠要寫兩遍。如果覺得麻煩,也可以使用“/”斜杠作為

路徑分隔符,就像代碼中被注釋掉的那行一樣。(2)參數(shù)mode:文件的打開模式。打開模式通常有讀、寫、追加等幾種,表7.1

是文件的常見打開模式。其中,寫入模式和追加

模式的區(qū)別在于,如果打開的文件原來有內(nèi)容,則寫入模式會完全覆蓋掉原來的內(nèi)容,而追加模式

會在原內(nèi)容的后邊追加新的內(nèi)容。如果沒有指定打開模式,則默認為“r”模式也就是讀模式。使用“r”模式打開文件時,要求目

標文件一定要事先存在,否則會報錯。而使用“w”模式打開文件時,如果文件名指定的文件不存

在,則

open()函數(shù)會創(chuàng)建這個文件。7.1.3open()函數(shù)的使用(3)參數(shù)

encoding:針對文本文件的編碼、解碼方案。打開文件時常用到的第三個參數(shù)就是

encoding。注意,這里只是說

encoding是常用到的第三個

參數(shù),不是說

encoding是

open()函數(shù)的第三個參數(shù)。實際上

encoding是

open()函數(shù)的第四個參數(shù)。這意味著為

encoding

參數(shù)傳值時,一般要明確寫出參數(shù)名,即像

encoding="utf-8"

這樣書寫,這和前兩個參數(shù)不同。文件名和打開模式這兩個參數(shù)在傳值時寫不寫參數(shù)名都沒問題,因為它們就是

open()函數(shù)的第一、第二個參數(shù),按照位置對應(yīng)也是沒問題的。但

encoding是

open()函數(shù)的第四個參數(shù),如果代碼

7.1傳值時只寫"utf-8",實際上是傳給了

open()函數(shù)的第三個參數(shù)。代碼

7.1如果去掉

encoding參數(shù)的設(shè)置就會報錯,錯誤原因是解碼方案不對,無法正確解碼。

當打開的文本文件遇到編碼錯誤時,就要了解該文件使用的是何種編碼,通過

encoding參數(shù)設(shè)置正

確的解碼方案。7.1.3open()函數(shù)的使用打開模式說明r以只讀方式打開文件,默認模式w以寫入模式打開文件a以追加模式打開文件表

7.1文件的常見打開模式PART27.2文件的讀寫操作open()函數(shù)得到的文件對象有

3個常用的讀取文件內(nèi)容的方法,分別是

read()方法、readline()方

法和

readlines()方法。下面以文本文件為例介紹這

3個方法的用法。1.read()方法這個方法可讀入指定長度的內(nèi)容,如果沒有指定長度,則默認將文本文件的內(nèi)容全部讀入。該

方法返回的是一個字符串。代碼

7.2演示了

read()方法的使用。代碼

7.2

文件對象的

read()方法代碼

7.2

的運行結(jié)果如下,只有原文的前一小部分內(nèi)容。讀者可將

read()方法括號中的

35去掉,

看一下返回的結(jié)果。7.2.1讀取文本文件file_obj=open("file/長信宮燈.txt","r",encoding="utf-8")text=file_obj.read(35)#讀取前

35個字符print(text)file_obj.close()長信宮燈一改以往青銅器皿的神秘厚重,整個造型及裝飾風格都顯得舒展自如、2.readline()方法顧名思義,readline()方法一次可以讀入文本文件的一行,如代碼

7.3所示。這段代碼要打開的文

本文件內(nèi)含納蘭性德的一首《浣溪沙》詞,整個文本內(nèi)容從標題、作者到正文被分成了幾行書寫。

每次調(diào)用readline()方法都會讀入一行文本,直到文件尾部。代碼

7.3

文件對象的

readline()方法代碼

7.3

的運行結(jié)果如下。這里有一個細節(jié)需要說明,代碼中的

print()函數(shù)通過

end

參數(shù)關(guān)閉了自帶的換行效果。這是因

為文本文件中每一行的結(jié)尾都有一個看不見的換行符,如果不對

end

參數(shù)進行設(shè)置,則每輸出一行文本會換兩次行。7.2.1讀取文本文件file_obj=open("file/浣溪沙.txt","r",encoding="utf-8")text=file_obj.readline()whiletext

!=

"":print(text,end="")text=file_obj.readline()file_obj.close()浣溪沙【清】納蘭性德誰念西風獨自涼,蕭蕭黃葉閉疏窗。沉思往事立殘陽。被酒莫驚春睡重,賭書消得潑茶香。當時只道是尋常。3.readlines()方法與

readline()方法不同,readlines()方法將文本文件的內(nèi)容以列表形式返回,文件的每一行是列表

的一個元素,如代碼

7.4所示。代碼

7.4

文件對象的

readlines()方法readlines()方法會將文件中的所有行都讀取出來,每一行文本作為一個元素保存在列表lines_lst

中,所以代碼

7.4

的運行結(jié)果如下,注意每行行尾的換行符。7.2.1讀取文本文件file_obj=open("file/浣溪沙.txt","r",encoding="utf-8")lines_lst=file_obj.readlines()print(lines_lst)file_obj.close()['浣溪沙\n','【清】納蘭性德\n','誰念西風獨自涼,蕭蕭黃葉閉疏窗。沉思往事立殘陽。\n','被酒莫驚春睡重,

賭書消得潑茶香。當時只道是尋常。\n']如果讀入文本內(nèi)容后不是簡單地從頭到尾輸出,而是有其他處理需求,則可以根據(jù)需要組合使

用多個讀入文本的方法。例如,代碼

7.5使用了

readline()和

readlines()兩個方法,將詞的標題、作者與正文分開處理。代碼

7.5

組合使用文件對象的方法7.2.1讀取文本文件file_obj.close()forline

in

lines_lst:print(line,end="")author=author[:-1]#去掉行尾的換行符title=title[:-1]msg="——{a}

·《{t}》".format(a=author,t=title)

print(msg)title=file_obj.readline()author=file_obj.readline()lines_lst=file_obj.readlines()file_obj=open("file/浣溪沙.txt","r",encoding="utf-8")#讀取詞標題

#讀取詞作者

#讀取詞正文代碼沒有按照原始書寫順序輸出,而是希望將標題與作者放到正文的后邊,并為詞的標題添加了書名號,最終的運行結(jié)果如下。誰念西風獨自涼,蕭蕭黃葉閉疏窗。沉思往事立殘陽。被酒莫驚春睡重,賭書消得潑茶香。當時只道是尋常?!厩濉考{蘭性德

·《浣溪沙》向文本文件寫入內(nèi)容的操作可以通過文件對象的write()方法來完成,該方法只是將指定的字符

串寫入文件,如果需要換行,則換行符也需要調(diào)用者提供。代碼

7.6

使用

write()方法向文本文件寫入

3

個“不要回答!”,因為沒有提供換行符,所以雖

然代碼分

3行調(diào)用了

3次

write()方法,但是寫入的

3個“不要回答!”會出現(xiàn)在同一行。如果希望文件中分

3行書寫,那么應(yīng)該改為“不要回答!\n”。代碼

7.6使用文件對象的write()方法另外需要注意的是,上述代碼使用了“w”模式打開文件,如果使用“r”模式打開文件,那么

是無法寫入內(nèi)容的。但“w”模式意味著每次寫入內(nèi)容時都會覆蓋原來的內(nèi)容,如果想要在原來內(nèi)容的基礎(chǔ)上追加內(nèi)容,那么就要使用“a”模式打開文件。7.2.2寫入文本文件#文本文件如果事先不存在,則

w模式下

open()函數(shù)會自動創(chuàng)建該文件myfile=open("file/三體.txt","w")myfile.write("不要回答!")myfile.write("不要回答!")myfile.write("不要回答!")myfile.close()無論是讀取內(nèi)容還是寫入內(nèi)容,每次打開文件時都要記著使用完畢后關(guān)閉文件??梢沁z忘了

怎么辦呢?為了確保文件用完之后關(guān)閉,也省去每次都要調(diào)用

close()方法的麻煩,Python提供了with

語句,這個語句可以進行某種情景管理。當使用open()函數(shù)打開文件得到文件對象后,把文件對象交給with

語句,with

語句會維護著使用該文件的情景,一旦程序完成了對該文件的使用,要離開

with情景時,with語句負責關(guān)閉文件,無須程序員手動書寫

close()方法了。在代碼

7.7

中,使用

open()函數(shù)打開文件后將文件對象交給

with語句,之后對文件的操作代碼

都從屬于with情景,因此會有縮進。當程序的執(zhí)行離開with語句時就意味著對該文件的操作結(jié)束了,

with語句會自動關(guān)閉該文件。代碼

7.7

使用

with語句自動關(guān)閉文件7.2.3with語句withopen("file/陶行知名言.txt","a",encoding="utf-8")asmyfile:myfile.write("人生天地間,各自有稟賦;為一大事來,做一大事去。\n")withopen("file/陶行知名言.txt","r",encoding="utf-8")asmyfile:text_lst=myfile.readlines()forline

in

text_lst:print(line[:-1])左側(cè)代碼中,open()函數(shù)返回的文件對象通過

as關(guān)鍵字起名為

myfile,在

with語句塊內(nèi)可以使

myfile

指代這個文件,對其進行各種操作。從下面的輸出結(jié)果可知,該文本文件在追加內(nèi)容之前,原本有一行陶先生的名言。千教萬教,教人求真;千學(xué)萬學(xué),學(xué)做真人。人生天地間,各自有稟賦;為一大事來,做一大事去。PART37.3Python生態(tài)系統(tǒng)之os庫標準庫

os

的名稱來自

Operating

System(操作系統(tǒng))的縮寫,它是

Python和操作系統(tǒng)打交道的

一個重要的庫。平時交互式操作計算機時,免不了要頻繁和文件系統(tǒng)打交道,如創(chuàng)建新的文件夾、

在文件夾路徑中移動位置、刪除已有的文件夾、給文件夾和文件改名等操作都是十分常見的。這些操作平時可以通過鍵盤、鼠標交互式完成,但要是在程序代碼中需要做這些操作該怎么辦呢?這時就該

os庫出馬了。os庫中有一個rename()函數(shù)可以為文件或文件夾修改名稱,如代碼

7.8所示。

代碼

7.8使用

rename()函數(shù)修改文件名7.3.1修改文件名import

oswithopen("file/test.txt","w")asmyfile:myfile.write("仕而優(yōu)則學(xué),學(xué)而優(yōu)則仕\n")myfile.write("意思是工作后還有余力的就應(yīng)該去學(xué)習進修,不斷提高自己;")myfile.write("學(xué)習、研究之余要多參與具體的工作與實踐。\n")os.rename("file/test.txt","file/論語摘錄.txt")print("改名成功")這段代碼要求

file文件夾事先存在,test.txt文件存在與否均可,因為代碼以“w”模式打開test.txt

文件,如果

file

文件夾下沒有該文件則

open()函數(shù)會創(chuàng)建這個文件。之后代碼向文件內(nèi)寫入從《論

·子張》中摘錄的片段及現(xiàn)代文解釋。當with語句結(jié)束時打開的文件會被關(guān)閉,對test.txt文件的占

用將被釋放,從而可以使用os庫中的rename()函數(shù)對其進行重命名,將“test.txt”改名為“論語摘錄.txt”。可以使用

os庫中的

remove()函數(shù)刪除文件。例如,代碼

7.9

中如果在詢問是否刪除文件時回答

“Y”,論語摘錄.txt文件將會被刪除。代碼7.9

使用

remove()函數(shù)刪除文件remove()函數(shù)在刪除文件時是直接刪除的,因此使用該函數(shù)時要謹慎,確保不會誤操作。7.3.2刪除文件import

oswithopen("file/論語摘錄.txt","w")asmyfile:myfile.write("日知其所亡,月無忘其所能,可謂好學(xué)也已矣。\n")answer=input("要刪除該文件嗎?

(Y/N)")ifanswer.upper()==

"Y":os.remove("file/論語摘錄.txt")print("文件刪除成功。")os

庫中也有多個完成文件夾操作的函數(shù),如新建文件夾的mkdir()函數(shù)、切換當前文件夾的chdir()

函數(shù)及顯示當前路徑下文件清單的

listdir()函數(shù)等。代碼

7.10演示了這幾個函數(shù)的使用。代碼

7.10os庫中文件夾相關(guān)的函數(shù)使用示例7.3.3文件夾相關(guān)操作import

osos.mkdir("./mydir")#新建mydir

文件夾,該文件夾不能已經(jīng)存在withopen("中國小說.txt","w")as

f:f.write("《芙蓉鎮(zhèn)》《平凡的世界》《張居正》《額爾古納河右岸》《蛙》")withopen("外國小說.txt","w")as

f:f.write("《約翰·克利斯朵夫》《長日將盡》《亂世佳人》《鼠疫》")print(f"文件夾{current_path}下的文件:")forfile_name

inos.listdir():print(file_name)answer=input("os庫試驗結(jié)束,是否刪除以上文件夾與文件?

(Y/N)")

ifanswer.upper()==

"Y":forfile_name

inos.listdir():os.remove(file_name)

os.chdir("..")os.rmdir("./mydir")print("刪除完畢。")os.chdir("./mydir")current_path=os.getcwd()#刪除每一個文件

#向上一層#刪除mydir

文件夾#切換當前路徑到新建的文件夾

#獲取當前路徑代碼

7.10

的運行結(jié)果如下。文件夾

D:\代碼示例\mydir下的文件:中國小說.txt外國小說.txtos庫試驗結(jié)束,是否刪除以上文件夾與文件?

(Y/N)y刪除完畢。這段代碼首先使用

mkdir()函數(shù)在當前文件夾下新建一個mydir文件夾,“./mydir”

中的點代表

當前文件夾。然后使用

chdir()函數(shù)將當前路徑切換到新建的

mydir文件夾。而

getcwd()函數(shù)則可以獲

取當前的路徑。接下來使用

open()函數(shù)的“w”模式新建兩個文件,并各自寫入一行文本。代碼最后

通過

listdir()函數(shù)獲取當前路徑下即

mydir文件夾下的文件名清單并輸出。讀者可去磁盤上檢驗這一

切操作的結(jié)果,確認完畢后再來回答是否要刪除這些試驗中創(chuàng)建的文件。如果回答“Y”,則接下

來的代碼會將文件及文件夾都刪除。最后,為了便于記憶,表

7.2給出以上各函數(shù)名稱的含義。7.3.3文件夾相關(guān)操作函數(shù)名含義mkdir()make

directory(創(chuàng)建目錄)chdir()change

directory(修改目錄)rmdir()remove

directory

(刪除目錄)getcwd()get

current

work

directory

(獲取當前工作目錄)listdir()list

directory

(列表目錄)表

7.2os庫的常用函數(shù)PART47.4小試牛刀在掌握了文件的基本使用流程后,本章的小試牛刀環(huán)節(jié)演練幾個需要訪問文本文件的案例,感受有了文件的加持后程序功能的提升。7.4.1

保存比薩定價第

6章的小試牛刀練習了一個計算比薩價格的案例,比薩店提供

2

種尺寸的比薩(12寸、16

寸),

還有

3種調(diào)料

greenpeppers、mushrooms、extracheese。它們的定價都直接寫在了當時的代碼

中,這意味著如果老板想要調(diào)整價格就需要修改代碼,這顯然是不現(xiàn)實的。比較可行的做法是將比薩的基礎(chǔ)價格及各種調(diào)料的價格保存在一個文本文件中,店

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論