Python文件處理
數據的存儲可以使用資料庫,也可以使用文件。 資料庫保持了數據的完整性和關聯性,且使用數據更安全、可靠。使用文件存儲數據則非常簡單、易用,不必安裝資料庫管理系統等運行環境。 文件通常用於存儲應用軟體的參數或臨時性數據,是一個命名的比特集合,存儲在硬碟、U盤、快閃記憶體條等輔助存儲設備中。 文件分為兩類:文本文件和二進位文件。 Python提供了os、os.path、shutil等模塊處理文件。
文本文件的特點:1. 基本是字元串。Python源代碼文件和HTML文件等都屬於文本文件。2. 可使用任何文本編輯器進行編輯,對人來說相對容易閱讀和修改。3. 對程序來說,無法直接閱讀文本文件。通常,每種文本文件都需要使用相應的分析程序來閱讀,例如,Python使用專用分析程序來幫助閱讀.py文件,而要閱讀HTML文件,需要使用專用於HTML的分析程序。4. 通常比等價的二進位文件大。需要通過網路發送大型文本文件時,一般要進行壓縮(如壓縮成zip格式),以提高傳輸速度和節省磁碟空間。二進位文件的特點:1. 通常是人無法直接閱讀的,且使用常規的文本編輯器無法查看。在文本編輯器中打開二進位文件時,顯示的是一堆亂碼。有些類型的二進位文件(如JPEG圖像)需要使用特殊查看器顯示其內容。2. 佔據的空間通常比等價的文本文件小。3. 對程序來說,可以直接閱讀二進位文件。雖然二進位文件各不相同,但通常無需編寫複雜的分析程序來讀取它們。4. 通常與特定程序相關聯,若沒有該程序,通常無法使用它們。有些流行的二進位文件的格式是公開的,如果願意,可以自己編寫讀寫它們的程序,但通常需要花費很大的功夫。
一、文件的常見操作
文件的常見操作包括:
- 打開文件
- 讀寫文件
- 複製文件
- 刪除文件
1、文件的創建
文件的打開或創建可以使用函數open。該函數可以指定處理模式,設置打開的文件為只讀、只寫或可讀寫狀態。
格式: open(file, [mode[, buffering]])—>file object
- 說明:
- 參數file是被打開的文件名。若文件file不存在,open()將創建該文件,然後再打開該文件。
- 參數mode是指文件的打開模式。打開模式如表8-1。
- 參數buffering設置緩存模式。0表示無緩衝;1表示行緩衝;如果大於1則表示緩衝區的大小,,-1(或者任何負數)代表使用默認的緩衝區大小。以位元組為單位。
- open()返回1個file對象,file對象可以對文件進行各種操作
文件的打開模式
參數描述r以只讀的方式打開文件r+以讀寫的方式打開文件w以寫入的方式打開文件。先刪除文件原有的內容,再重新寫入新的內容。如果文件不存在,則創建一個新的文件。w+以讀寫的方式打開文件。先刪除文件原有的內容,再重新寫入新的內容。如果文件不存在,則創建一個新的文件。a以寫入的方式打開文件,在文件末尾追加新的內容。如果文件不存在,則創建一個新文件a+以讀寫的方式打開文件,在文件末尾追加新的內容。如果文件不存在,則創建一個新文件b以二進位模式打開文件。可與r、w、a、+結合使用U支持所有的換行符號。如:』
』、』
』、』
』
關於file類:
file類用於文件管理,可以對文件進行創建、打開、讀寫、關閉等操作。 文件的處理一般分為三個步驟:
- 創建並打開文件,使用open()函數返回1個file對象。
- 調用file對象的read()、write()等方法處理文件。
- 調用close()關閉文件,釋放file對象佔用的資源。
file類的常用屬性和方法
屬性和方法描述closed判斷文件是否關閉,如果文件關閉,返回Trueencoding顯示文件的編碼類型mode顯示文件的打開模式name顯示文件的名稱newlines文件使用的換行模式file(name[,mode[,buffering]])以mode指定的方式打開文件。如果文件不存在,則先創建文件,再打開文件。Buffering表示緩存模式。0表示不緩存;1表示行緩衝;如果大於1則表示緩衝區的大小;-1或其他負數表示默認緩衝區flush()將緩衝區的內容寫入磁碟close關閉文件read([size])從文件中讀取size個位元組的內容,作為字元返回readline([size])從文件中讀取1行,作為字元串返回。若指定size,表示每行每次讀取的位元組數,依然要讀完整行的內容readlines([size])將文件中的每行存儲在列表中返回。若指定size,表示每次讀取的位元組數seek(offset[,whence])將文件的指針移動到一個新的位置。Offset表示相對於whence的位置。Whence用於設置相對位置的起點,0表示從文件開頭開始計算;1表示從當前位置開始計算;2表示從文件末尾開始計算。若whence省略,offset表示相對文件開頭的位置tell()返迴文件指針當前的位置next()返回下一行的內容,並將文件的指針移到下一行truncate([size])刪除size個位元組的內容write(str)將字元串str的內容寫入文件writelines(sequence_of_string)將字元串序列寫入文件
例:文件的創建、寫入和關閉
例:在文件尾添加內容
2、文件的讀取
文件的讀取有多種方法,可以使用readline()、readlines()或read()函數讀取文件。
(1)按行讀取方式readline()
readline()每次讀取文件中的一行,需要使用永真表達式循環讀取文件。但當文件指針移動到文件的末尾時,依然使用readline()讀取文件將出現錯誤。因此程序中需要添加1個判斷語句,判斷文件指針是否移動到文件的尾部,並且通過該語句中斷循環。
例:使用readline()讀文件
執行結果:
(2)多行讀取方式
- 函數readlines()可一次性讀取文件中多行數據。
- 使用readlines()讀取文件,需要通過循環訪問readlines()返回的內容。
例:使用readlines()讀文件
執行結果:
(3)一次性讀取方式
讀取文件最簡單的方法是使用read(),read()將從文件中一次性讀出所有的內容,並賦值給1個字元串變數。
例:使用read()返回指定位元組的內容
執行結果:
3、文件的寫入
- 文件的寫入同樣有多種方法,可以使用write()、writelines()方法寫入文件。
- 使用write()方法將字元串寫入文件,而writelines()方法可將列表中存儲的字元串序列寫入文件。
例:使用writelines()寫文件
將字元串插入到文件開頭:
- 相比在文件末尾添加字元串,將字元串寫入文件開頭不那麼容易,因為操作系統沒有提供這樣的支持。
- 解決的方法是:將文件讀取到一個字元串中,將新文本插入到該字元串,再將這個字元串寫入原來的文件。
例:將字元串插入到文件開頭
4、文件的刪除
- 刪除文件需要使用os模塊和os.path模塊。
- os模塊提供了對系統環境、文件、目錄等操作系統級的介面函數。
- 下表列出了os模塊常用的文件處理函數。
表:os模塊常用的文件處理函數
函數描述access(path,mode)按照mode指定的許可權訪問文件chmod(path,mode)改變文件的訪問許可權open*filename,flag[,mode=0777])按照mode指定的許可權打開文件。默認情況下,給所有用戶讀、寫、執行的許可權remove(path)刪除path指定的文件rename(old,new)重命名文件或目錄。old表示原文件或目錄,new表示新文件或目錄stat(path)返回path指定文件的所有屬性fstat(path)返回打開的文件的所有屬性lseek(fd,pos,how)設置文件的當前位置,返回當前位置的位元組數startfile(filepath[,operation])起動關聯程序打開文件。例如:打開的是一個html文件,將啟動IE瀏覽器tmpfile()創建一個臨時文件,文件創建在操作系統的臨時目錄中
表:os.path模塊常用函數
函數描述abspath(path)返回path所在的絕對路徑dirname(p)返回目錄的路徑exists(path)判斷文件是否存在getatime(filename)返迴文件的最後訪問時間getctime(filename)返迴文件的創建時間getmtime(filename)返迴文件的最後修改時間getsize(filename)返迴文件的大小isabs(s)測試路徑是否絕對路徑isdir(path)判斷path指定的是否是目錄isfile(path)判斷path指定的是否是文件split(p)對路徑進行分隔,並以列表方式返回splitext(p)從路徑中分割文件的擴展名splitdrive(p)從路徑中分割驅動器的名稱walk(top,func,arg)遍歷目錄數,與os.walk()功能相同
注意:os模塊的open()函數與內置的open()函數的用法不同。
例:文件的刪除
5、文件的複製
file類並沒有提供直接複製文件的方法,但可以使用read()、write()方法來實現複製文件的功能。
例:用read()、write()實現文件複製
複製文件的其他方法:
- shutil模塊是另一個文件、目錄的管理介面,提供了一些用於複製文件、目錄的函數。
- 其中,copyfile()函數可以實現文件的複製,move()函數可以實現文件的剪切。 copyfile(src, dst)
- 其中,參數src表示源文件的路徑,dst表示目標文件的路徑,均為字元串類型。
- Move(src, dst, *, follow_symlinks=True)
例:使用shutil模塊實現文件的複製和移動
6、文件的重命名
- os模塊的函數rename()可以對文件或目錄進行重命名。
- 在實際應用中,經常需要將某一類文件修改為另一種類型,即修改文件的後綴名。可以通過函數rename()和字元串查找函數來實現。
例:修改後綴名
7、文件內容的搜索和替換
文件內容的搜索和替換可以使用字元串查找和替換來實現。
例:從hello.txt文件中統計字元串』hello』出現的次數。
8、處理二進位文件
- Python中,通常使用pickle模塊處理二進位文件。
- 可以使用pickle.dump將數據結構存儲到磁碟,之後再用pickle.load從磁碟獲取數據結構。
- pickle不能用於讀寫特殊格式的二進位文件,如GIF文件。對這種格式的文件,必須逐位元組處理。
例:二進位文件存取
執行結果:
二、目錄的常見操作
Python的os模塊和os.path模塊還提供了一些針對目錄操作的函數。
1、創建目錄和刪除目錄
os模塊提供的常用目錄處理函數如表所示。
表:os模塊常用目錄處理函數
函數描述mkdir(path[,mode=0777])創建path指定的一個目錄makedirs(name,mode=511)創建多級目錄,name表示為「path1path2…」rmdir(path)刪除path指定的目錄removedirs(path)刪除path指定的多級目錄listdir(path)返回path指定目錄下的所有文件名getcwd()返回當前工作目錄chdir(path)改變當前目錄為path指定的目錄walk(op,topdown=True,onerror=None)遍歷目錄樹path.isfile(path)當path指定的是一個文件的名稱時,返回True,否則返回Falsepath.isdir(path)當path指定的是一個文件夾的名稱時,返回True,否則返回Falsestat(fname)返回有關fname的信息,如大小(單位為位元組)和最後一次修改時間。詳細功能參加在線文檔
例:目錄的創建和刪除
2、目錄的遍歷
目錄的遍歷有兩種實現方法:遞歸函數、os.walk()。
例:用遞歸函數遍歷目錄d:Python34lib
例:使用os.walk()遍歷目錄
3、其他目錄相關操作
對目錄的常見操作還有: 返回當前目錄中的文件和文件夾; 返回當前目錄中的指定類型文件; 返回當前目錄中所有文件的大小總和等。
例:返回當前目錄中的文件和文件夾
例:返回當前目錄或指定目錄中的.py文件
例:返回當前目錄中所有文件的大小總和
推薦閱讀: