03.04 Python學習入門(23)—讀寫文件

(本號正在連續推出以Python官網文檔為主線的系統學習Python的系列文章或視頻,感興趣的朋友們歡迎搜索關注。在這裡學習Python事半功倍!本文及後續文章如無特別聲明均以Windows平臺作為演示平臺,Python版本為:3.8.1)


文件對象的獲取

Python中讀寫文件是通過文件對象實現的,而文件對象是由內置函數open(filename, mode)獲取。open函數有兩個參數:第一個參數是一個包含文件名的字符串。第二個參數用於描述文件的使用模式的。當只讀取文件時,模式可以是‘r’,只寫入文件時為‘w’(已存在的同名文件將被刪除),而‘a’將打開文件進行附加,寫入文件的任何數據都會自動添加到末尾。'r+'打開文件進行讀寫。模式參數是可選的,如果省略了則假定為‘r’。

通常,文件是在文本模式下打開的,這意味著從文件中讀取和向文件寫入的是字符串,這些字符串是用特定的編碼編碼的。如果沒有指定編碼,則默認是平臺相關的。如果將附加'b'到上述模式參數時則以二進制模式打開文件:數據是以字節的形式進行讀取和寫入,此模式應用於所有不包含文本的文件。

在文本模式下,讀取方式默認是將特定於平臺的行尾(Unix上的\\n, Windows上的\\r\\n)轉換為 \\n。在文本模式下寫入時,默認情況下將出現的\\n轉換回特定於平臺的行尾。這種文件數據的幕後修改對於文本文件來說是可以的,但是會破壞像JPEG或EXE這樣二進制文件的數據。在讀取和寫入這些文件時,要非常小心地使用二進制模式。

在用到文件對象時好的做法是使用with關鍵字。這樣做的好處是,即使在某個時候引發了異常,文件正確地關閉。使用with也比編寫等效try-finally塊要短得多:

<code>with open('testFile.txt') as f:   #打開當前目錄下的文件testFile.txt
read_data = f.read()
f.closed/<code>

如果您沒有使用with關鍵字,那麼您應該調用f.close()來關閉文件,並立即釋放它所使用的任何系統資源。如果您沒有顯式地關閉文件,Python的垃圾收集器將最終銷燬該對象併為您關閉打開的文件,但是該文件可能會保持打開狀態一段時間。另一個風險是,不同的Python實現會在不同的時間進行清理。

文件對象關閉後,無論是通過with語句還是調用f.close()再次使用文件對象都會失敗。

文件對象的方法

本節其餘的示例將假定已經創建了一個名為f的文件對象

f.read(size) 用於讀取文件的內容。此方法讀取一些數據並以字符串(文本模式)或字節對象(二進制模式)的形式返回。size是一個可選的數字參數。當大小被省略或為負值時,將讀取並返回文件的全部內容。否則,讀取和返回的最多是size字符(在文本模式下)或size字節(在二進制模式下)。如果已經到達文件的末尾,f.read()將返回一個空字符串(")。注意:Python是不考略讀取的字符(或字節)超出機器內存的情況的。

f.readline() 可從文件中讀取一行,換行符(\\n)留在字符串的末尾,只有在文件的最後一行沒有換行時才會省略。這使得返回值沒有歧義:如果f.r ereline()返回一個空字符串,則文件結束,而空行由'\\n'表示,該字符串只包含一個換行符。

遍歷file對象 可用於從文件中讀取行。如下面是內存效率高,速度快,並且簡單的代碼:

<code>for line in f:
print(line, end='')/<code>

如果希望讀取中文件的所有行,也可以使用list(f)或f.r adlines()。

f.write(string) 可將字符串的內容寫入文件,返回寫入的字符數。

注意:其他非字符串或字節類型的對象在寫入文件前是需要轉換的,或者轉換成字符串(在文本模式下)或者轉換成字節對象(在二進制模式下)。

f.tell() 返回一個整數,該整數表示文件對象在文件中的當前位置。在二進制模式下以文件開頭的字節數表示。在文本模式下以不透明數字表示,該數字通常不表示底層二進制存儲中的字節數。

f.seek(offset,whence) 更改文件對象的當前位置。通過向參考點添加偏移量計算位置,參考點是由where參數提供的。其中值0表示從文件開頭開始,1使用當前文件位置,2使用文件結尾作為參考點。whence可以省略,若省略則默認為0,即使用文件的開頭作為參考點。

】在文本文件中(在模式字符串中沒有b的情況下打開的文件),只允許相對於文件開頭的查找(異常是查找到文件末尾的seek(0,2)),惟一有效的偏移值是從f.tell()返回的值,或者是0。任何其他偏移值都會產生未定義的行為。

文件對象有一些不常用的方法,如isatty()和truncate(),這裡就不作介紹,後面用到時再詳細介紹。

使用json保存結構數據

字符串可以很容易地寫入和讀取文件。由於read()方法只返回字符串,因此讀寫數值需要做更多的工作:必須將字符串傳遞給int()這樣的函數,int()接受字符串'123'並返回其數值123。當保存更復雜的數據類型(如嵌套列表和字典)時,手動解析和序列化就變得更復雜了。

Python允許您使用流行的數據交換格式JSON (JavaScript的對象表示法),這樣用戶就不用不斷地編寫和調試代碼來將複雜的數據類型保存到文件中。名為json的標準模塊可以將Python數據層次結構轉換為字符串表示形式。這個過程稱為序列化,從字符串表示形式重新構造數據稱為反序列化。在序列化和反序列化之間,表示對象的字符串就可以被存儲在文件或數據中,或者通過網絡連接發送到某個遠程機器。

【注】現代應用程序通常使用JSON格式來進行數據交換。使用它可以實現較好的互操作性。

使用json.dumps(obj)可以生成對象obj的JSON字符串形式。使用json.dump(obj,f)可以將obj的JSON字符串寫入文本文件f中,從文本文件f中讀出obj使用x = json.load(f)。


【結束】


Python學習入門(23)—讀寫文件


分享到:


相關文章: