Python程序設(shè)計基礎(chǔ)-教學課件 第7章 文件和異常處理_第1頁
Python程序設(shè)計基礎(chǔ)-教學課件 第7章 文件和異常處理_第2頁
Python程序設(shè)計基礎(chǔ)-教學課件 第7章 文件和異常處理_第3頁
Python程序設(shè)計基礎(chǔ)-教學課件 第7章 文件和異常處理_第4頁
Python程序設(shè)計基礎(chǔ)-教學課件 第7章 文件和異常處理_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章

文件和異常處理目錄7.1文件概述7.2文件訪問7.3文件操作7.4os模塊中的文件操作方法7.5shutil模塊中的文件操作方法7.6異常7.1.1

文件的分類(1)文本文件文本文件是指由字母、數(shù)字、符號和漢字等常規(guī)字符組成的順序文件。其中,字母、數(shù)字等字符存儲的是

ASCII

碼,而漢字存儲的是機內(nèi)碼。文本文件是由若干文本行組成,通常每行以換行符“\n”結(jié)尾。常規(guī)字符是指記事本或其他文本編輯器能正常顯示、編輯并且人類能夠直接閱讀和理解的字符。例如,擴展名為

.txt、.c、.cpp、.py

等文件都屬于文本文件?!纠?-1】文本文件存儲示例若當前要存儲一個整數(shù)數(shù)據(jù)

312685,則該數(shù)據(jù)在磁盤上的存放形式如圖7-1所示。

圖7-1文本文件存儲形式文本文件中的每個字符都要占用一個字節(jié)的存儲空間,并且在存儲時要進行二進制和ASCII之間的轉(zhuǎn)換,因此使用這種方式消耗空間,也浪費時間。7.1.1

文件的分類(2)二進制文件二進制文件是指數(shù)據(jù)或程序以字節(jié)串進行存儲,無法用記事本或其他普通字符處理軟件直接進行編輯,通常也無法被人類直接閱讀和理解,需要使用正確的軟件進行解碼或反序列化之后才能正確地讀取、顯示、修改或執(zhí)行。例如,圖形圖像文件、音頻文件、視頻文件、可執(zhí)行文件等都屬于二進制文件。數(shù)據(jù)在內(nèi)存中是以二進制形式存儲的,如果不加轉(zhuǎn)換地輸出到外存,則輸出文件就是一個二進制文件。【例7-2】二進制文件存儲示例若當前要存儲一個整數(shù)數(shù)據(jù)312685,則該數(shù)據(jù)首先被轉(zhuǎn)換為二進制整數(shù),轉(zhuǎn)換后的二進制整數(shù)為0b1001100010101101101,此時該數(shù)據(jù)在磁盤上的存儲形式如圖7-2所示。

圖7-2二進制文件存儲形式7.1.1

文件的分類對比圖7-1和圖7-2,可以發(fā)現(xiàn):使用二進制文件存放時,占用4個字節(jié)空間,需要的存儲空間較少(文本文件存儲占6個字節(jié)),并且不需要進行好轉(zhuǎn)換,既節(jié)省空間,又節(jié)省空間。但缺點是不夠直觀,需要經(jīng)過轉(zhuǎn)換后才能看到存放的數(shù)據(jù)信息。注意:二進制文件和文本文件這兩種類型的劃分基于數(shù)據(jù)邏輯存儲結(jié)構(gòu)而非物理存儲結(jié)構(gòu),計算機中的數(shù)據(jù)在物理層面都以二進制形式存儲。圖7-1文本文件存儲形式圖7-2二進制文件存儲形式7.1.1

文件的分類(3)標準文件Python

sys

模塊中定義了

3

個標準文件,分別為:stdin(標準輸入文件):對應(yīng)輸入設(shè)備,如鍵盤。stdout(標準輸出文件):對應(yīng)輸出設(shè)備,如顯示器。stderr(標準錯誤文件):對應(yīng)輸出設(shè)備,如顯示器。在解釋器中添加

sys

模塊后,便可使用

Python

對象獲取這三個對象?!纠?-3】標準文件示例。importsysfile=sys.stdoutfile.write("hello")運行結(jié)果:hello結(jié)果分析:以上代碼將標準輸出文件賦給文件對象file,又通過文件對象file調(diào)用內(nèi)置方法write向標準輸出文件寫數(shù)據(jù)。觀察代碼執(zhí)行結(jié)果,"hello"被成功寫到了標準輸出中。每個終端都有其對應(yīng)的標準文件,這些標準文件在終端啟動的同時打開。7.1.2

文件的標識一個文件需要有唯一確定的文件標識,保證用戶可以根據(jù)標識找到唯一確定的文件。文件標識包括三個部分,分別為文件路徑、文件名主干、文件擴展名。圖7-3文件標識圖7-3為一個文件的完整標識,根據(jù)該標識可以找到D:\Python\chapter7路徑下擴展名為.py、文件名為demo的文本文件。文件路徑是用來定位文件在計算機文件系統(tǒng)中位置的字符串。文件的路徑可分為絕對路徑和相對路徑。12絕對路徑是一個文件或目錄在文件系統(tǒng)中的完整路徑,包括從根目錄開始一直到目標文件或目錄的所有目錄層級信息。相對路徑是指文件或目錄相對于當前工作目錄的位置,而不是從根目錄開始的完整路徑。它是相對于當前工作目錄的路徑描述。相對路徑絕對路徑7.2

文件訪問在Python中,無論是文本文件還是二進制文件,對其操作流程基本是一致的,訪問文件可以分為三步:(1)打開文件使用open函數(shù)以指定的模式,如讀取、寫入、追加等方式打開文件。在打開文件后,會得到一個文件對象,后續(xù)的文件操作都將通過這個對象進行。(2)讀或?qū)懳募ㄟ^文件對象進行讀取或?qū)懭氩僮?。這包括讀取文件內(nèi)容、寫入數(shù)據(jù)到文件、移動文件指針等。具體的文件操作取決于打開文件的模式以及實際需求。(3)關(guān)閉文件調(diào)用文件對象的close函數(shù)關(guān)閉文件,釋放系統(tǒng)資源。7.2.1打開文件

Python內(nèi)置函數(shù)open用于指定模式打開指定文件并返回一個文件對象,其一般格式如下:open(file,mode='r',buffering=-1)參數(shù)含義如下:1)file:要打開的文件的路徑或文件對象??梢允窍鄬β窂?、絕對路徑或文件對象。2)mode:打開文件的模式。默認為讀取模式'r'。3)buffering:緩沖策略??刂莆募木彌_行為。默認值為-1,表示使用系統(tǒng)默認的緩沖區(qū)大小。0表示不緩沖,1表示行緩沖,其他正整數(shù)表示緩沖區(qū)大小。模式名稱說明'r'/'rb'只讀模式以只讀的形式打開文本文件/二進制文件,若文件不存在或無法找到,文件打開失敗。'w'/'wb'只寫模式以只寫的形式打開文本文件/二進制文件,若文件已存在,則重寫文件,否則創(chuàng)建新文件。'a'/'ab'追加模式以只寫的形式打開文本文件/二進制文件,只允許在該文件末尾追加數(shù)據(jù),若文件不存在,則創(chuàng)建新文件。'r+'/'rb+'讀取(更新)模式以讀/寫的形式打開文本文件/二進制文件,若文件不存在,文件打開失敗。'w+'/'wb+'寫入(更新)模式以讀/寫的形式打開文本文件/二進制文件,若文件已存在,則重寫文件。'a+'/'ab+'追加(更新)模式以讀/寫的形式打開文本/二進制文件,只允許在文件末尾添加數(shù)據(jù),若文件不存在,則創(chuàng)建新文件。7.2.2關(guān)閉文件在Python中,關(guān)閉文件是一個重要的操作,以釋放系統(tǒng)資源并確保對文件所做的更改被正確保存。通常,使用close方法來手動關(guān)閉文件。最佳的實踐是在文件操作結(jié)束后立即關(guān)閉文件,或者使用with語句(上下文管理器),這將確保文件在離開代碼塊時自動關(guān)閉。(1)close方法文件使用完畢后則通過close方法關(guān)閉文件,一般格式如下:file.close()程序執(zhí)行完畢后,系統(tǒng)會關(guān)閉由該程序打開的文件,但更好的做法是在文件使用完畢后,由程序調(diào)用close方法關(guān)閉文件。(2)with語句with-as語句適用于對資源進行訪問的場合,可確保不管在使用過程中是否發(fā)生異常都會執(zhí)行必要的“清理”操作,釋放使用資源,如文件使用后自動關(guān)閉等。在Python中,對文件進行讀/寫時的with-as語句常用格式如下:withopen(filename[,mode])asfile:語句塊其中,file為open函數(shù)返回的文件對象。7.3

文件操作在Python中,文件的讀寫是常見的任務(wù)之一。當文件被打開后,根據(jù)打開方式不同,可以對文件進行相應(yīng)的操作(如讀、寫以及關(guān)閉等),這些操作由文件對象的相關(guān)函數(shù)完成。當打開文本文件時,讀寫按照字符串方式,采用當前計算機使用的編碼或指定編碼;當打開二進制文件時,讀寫按照字節(jié)流的形式。7.3.1

文件讀操作(1)read(size=-1)函數(shù)read(size=-1)函數(shù)用于讀取指定大小的字符或字節(jié);可選的“size”參數(shù)指定要讀取的字節(jié)數(shù)或者字符數(shù),默認值為-1,表示讀取整個文件;此函數(shù)的返回值為返回讀取的內(nèi)容。(2)readline(size=-1)函數(shù)此函數(shù)的用途為讀取文件的一行。size參數(shù)是可選的,表示要讀取的字節(jié)數(shù),默認值為-1,表示讀取整行數(shù)據(jù)。此函數(shù)的返回值為讀取的行內(nèi)容。(3)readlines(hint=-1)函數(shù)此函數(shù)的用途為讀取所有行,并返回一個包含各行內(nèi)容的列表。可選的參數(shù)hint表示要讀取指定的字節(jié)數(shù),默認值為-1,表示讀取所有行。此函數(shù)的返回值為包含文件所有行內(nèi)容的列表。模式含義<file>.read(size=-1)從文件中讀取整個文件內(nèi)容,如果給出參數(shù),讀取前size長度的字符串或字節(jié)流。<file>.readline(size=-1)從文件中讀取一行內(nèi)容,如果給出參數(shù),讀取前size長度的字符串或字節(jié)流。<file>.readlines(hint=-1)從文件中讀取所有行,以每行為元素形成一個列表,如果給出參數(shù),讀取hint行。(1)write

函數(shù)file.write(string)其中,file是一個打開的文件對象??梢允褂脙?nèi)置函數(shù)

open

函數(shù)打開文件,或者為使用

with

語句時由open

函數(shù)返回的文件對象。string

為要寫入文件的字符串。write

方法將指定的字符串寫入文件。如果文件已經(jīng)存在,寫入文件將會覆蓋文件中的內(nèi)容。如果文件不存在,則會創(chuàng)建一個新文件進行寫入。(2)writelines

函數(shù)file.writelines(lines)其中,file是一個打開的文件對象??梢允褂脙?nèi)置函數(shù)

open

函數(shù)打開文件,或者為使用

with

語句時由open

函數(shù)返回的文件對象。lines

包括字符串的列表或可迭代對象。writelines

方法將列表中的每個字符串按順序?qū)懭胛募總€字符串占據(jù)一行。如果文件已經(jīng)存在,寫入操作將會覆蓋文件中的內(nèi)容。如果文件不存在,則會創(chuàng)建一個新文件進行寫入。7.3.2

文件寫操作方法說明<file>.write(s)向文件寫入一個字符串或字節(jié)流<file>.writelines(lines)將一個字符串列表寫入文件中(1)tell

方法tell

是文件對象的一個方法,用于獲取當前文件指針的位置(即當前讀取或?qū)懭氲奈恢茫K鼪]有參數(shù),調(diào)用它時不需要傳遞任何參數(shù)。file.tell()其中,file

是文件對象,可以通過

open

函數(shù)打開文件獲得。tell

方法返回一個整數(shù),表示當前文件指針的位置,即從文件頭到當前位置的字節(jié)數(shù)偏移量。一般來說,初始時文件指針位于文件開頭,即偏移量為

0。(2)seek

方法Python

提供了

seek

方法,使用該方法可控制文件的讀寫位置,實現(xiàn)文件的隨機讀寫。seek(offset,from)其中,參數(shù)

offset

表示偏移量,即讀寫位置需要移動的字節(jié)數(shù),可以為正數(shù)、負數(shù)或零。參數(shù)

from

用于指定文件的讀寫位置。seek

方法調(diào)用成功后會返回當前讀寫位置。7.3.3

文件的定位讀寫操作方法說明<file>.tell()獲取文件當前的讀寫位置。<file>.seek(offset,from)控制文件的讀寫位置。在

Python

中,文件迭代器通常是通過“

open

”函數(shù)與“

for

”循環(huán)結(jié)合使用來實現(xiàn)的。當打開一個文件并對其進行迭代時,Python

會將文件對象視為一個迭代器,并按行逐個讀取文件內(nèi)容,而不需要一次性將整個文件加載到內(nèi)存中。這對于處理大型文件或者需要逐行處理文件內(nèi)容的情況非常有用。7.3.4

文件迭代操作os(OperatingSystem)模塊是

Python

標準庫中的一個核心模塊,提供了與操作系統(tǒng)相關(guān)的功能,使得

Python

程序能夠與操作系統(tǒng)進行交互。os

模塊提供了一些方法來獲取關(guān)于平臺信息的操作。7.4os模塊中的文件操作方法——獲取平臺信息屬性/方法說明返回當前操作系統(tǒng)的名稱os.environ返回一個包含當前系統(tǒng)環(huán)境變量的字典os.cpu_count()返回當前系統(tǒng)的cpu核心數(shù)os.getcwd()獲取當前工作目錄os.sep返回操作系統(tǒng)特定的路徑分隔符os.pathsep查看用于分隔文件路徑的字符串7.4os

模塊中的文件操作方法——文件/目錄操作os模塊中定義了與文件操作相關(guān)的函數(shù),利用這些函數(shù)可以實現(xiàn)刪除文件、文件重命名、創(chuàng)建/刪除目錄、獲取當前目錄、更改默認目錄與獲取目錄列表等操作。方法說明os.mkdir(newpath)創(chuàng)建新目錄newpathos.rmdir(path)刪除目錄pathos.listdir(path)列出指定目錄path下所有的文件os.chdir(path)改變當前腳本的工作目錄為指定路徑pathos.remove(file)刪除一個指定文件fileos.rename(oldname,newname)重命名一個文件7.4os

模塊中的文件操作方法——os.path模塊

os.path

模塊提供了許多用于處理文件路徑的方法,提供了大量用于路徑判斷、切分、連接以及文件夾的遍歷方法。方法說明os.path.join(path1,path2,...)將多個路徑組合成一個路徑,在不同操作系統(tǒng)下會自動根據(jù)相應(yīng)的路徑分隔符來進行拼接。os.path.split(path)將路徑分割成目錄和文件名兩部分,并返回一個元組(head,tail)os.path.dirname(path)返回路徑中的目錄部分os.path.basename(path)返回路徑中的文件名部分os.path.splitext(path)分割路徑的文件名和擴展名,并返回一個包含文件名和擴展名的元組(root,ext)os.path.exists(path)判斷路徑是否存在os.path.isfile(path)判斷路徑是否為一個文件os.path.isdir(path)判斷路徑是否為一個目錄os.path.abspath(path)返回路徑的絕對路徑os.path.normpath(path)規(guī)范化路徑,消除路徑中的冗余monprefix(list)返回多個路徑的公共前綴7.5shutil

模塊中的文件操作方法

shutil

模塊提供了許多文件操作的方法,這些方法可以在不同的平臺上執(zhí)行各種文件相關(guān)的操作,下表是

shutil

模塊中一些常用的文件操作方法。方法說明shutil.copy(src,dst)復(fù)制文件,新文件具有相同的文件屬性,如果目標文件已經(jīng)存在則拋出異常。shutil.copyfile(src,dst)復(fù)制文件,不復(fù)制文件屬性,如果目標文件已存在則直接覆蓋。shutil.copytree(src,dst)遞歸復(fù)制文件夾shutil.disk_usage(path)查看硬盤使用情況shutil.move(src,dst)移動或遞歸移動文件夾,也可以用來給文件和文件夾重命名shutil.rmtree(path)遞歸刪除文件夾shutil.make_archive(filename,format,path)創(chuàng)建tar或zip格式的壓縮文件shutil.unpack_archive(filename,path)解壓縮文件7.6.1

異常的定義和分類

異常(Exception)是指程序在運行時遇到的錯誤或意外的情況。如果程序中沒有對異常進行處理,則程序會拋出該異常并停止運行。為了保證程序的穩(wěn)定性和容錯性,需要在程序中捕獲可能的異常并對其進行處理,使得程序不會因為異常而意外終止。

異??梢苑譃閮深悾赫Z法錯誤(SyntaxError)和邏輯錯誤(Exception)兩類。12語法錯誤是指在

Python

解釋器運行代碼之前就發(fā)生的錯誤,通常是由于代碼不符合

Python語法規(guī)則造成的。邏輯錯誤是指在

Python

解釋器運行代碼時發(fā)現(xiàn)的錯誤,通常是由于程序邏輯不正確造成的。邏輯錯誤語法錯誤7.6.1

異常的定義和分類異常描述ZeroDivisionError除數(shù)為零錯誤,例如

10/0。TypeError類型錯誤,例如使用了不兼容的數(shù)據(jù)類型,例如

1+'2'。ValueError值錯誤,例如傳遞了錯誤的參數(shù)值,例如

int('abc')。IndexError索引錯誤,例如訪問了不存在的索引,例如

lst[10]。KeyError鍵錯誤,例如訪問了不存在的鍵,例如

dct['key']。NameError名稱錯誤,例如使用了未定義的變量或函數(shù),例如

undefined_var。AttributeError屬性錯誤,例如訪問了不存在的屬性,例如

obj.undefined_attr。FileNotFoundError文件未找到錯誤,例如打開了不存在的文件,例如

open('file.txt')。IndentationError縮進錯誤,例如縮進不正確,例如

ifTrue:print('Hello').SyntaxError語法錯誤,例如代碼不符合語法規(guī)則,例如

print'Hello'。ImportError導入錯誤,例如導入了不存在的模塊,例如

importundefined_module。TypeError類型錯誤,例如使用了不兼容的數(shù)據(jù)類型,例如

1+'2'。ValueError值錯誤,例如傳遞了錯誤的參數(shù)值,例如

int('abc')。IndexError索引錯誤,例如訪問了不存在的索引,例如

lst[10]。KeyError鍵錯誤,例如訪問了不存在的鍵,例如

dct['key']。NameError名稱錯誤,例如使用了未定義的變量或函數(shù),例如

undefined_var。AttributeError屬性錯誤,例如訪問了不存在的屬性,例如

obj.undefined_attr。FileNotFoundError文件未找到錯誤,例如打開了不存在的文件,例如

open('file.txt')。IndentationError縮進錯誤,例如縮進不正確,例如

ifTrue:print('Hello').SyntaxError語法錯誤,例如代碼不符合語法規(guī)則,例如

print'Hello'。ImportError導入錯誤,例如導入了不存在的模塊,例如

importundefined_module。7.6.2

異常的處理編寫程序時可以對指定的異常做處理,以增強程序的穩(wěn)定性和容錯性。(1)try-except使用try-except語句可以捕獲異常并做異常處理,其語法格式如下:try:待捕獲異常的語句塊except異常類型1:異常類型1的處理語句塊except異常類型2:異常類型2的處理語句塊......except異常類型N:異常類型N的處理語句塊Try-except語句的處理過程為執(zhí)行try后面待捕獲異常的語句塊。如果沒有異常發(fā)生,則except子句不被執(zhí)行。如果有異常發(fā)生,則根據(jù)異常類型匹配每一個except關(guān)鍵字后面的異常名,并執(zhí)行匹配的except子句的語句塊;如果異常類型與所有except子句都不匹配,則該異常會傳給更外層的tryexcept語句;如果異常無法被任何except子句處理,則程序拋出異常并停止運行。7.6.2

異常的處理(2)elseelse子句是try-except語句中的一個可選項。如果try子句執(zhí)行時沒有發(fā)生異常,則在try子句執(zhí)行

溫馨提示

  • 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

提交評論