Python入門八輸入與輸出
Fancier輸出格式
到目前為止,我們遇到了兩種寫值的方法:表示式語句和print()
函式。(第三種方法是使用write()
檔案物件的方法;標準輸出檔案可以作為參考sys.stdout
。有關詳細資訊,請參閱庫參考。)
通常,您需要更多地控制輸出的格式,而不僅僅是列印空格分隔的值。有幾種格式化輸出的方法。
要使用格式化的字串文字,請在開始引號或三引號之前f
或F
之前開始一個字串。在這個字串中,你可以在{
和}
字元之間寫一個Python表示式,它可以引用變數或文字值。
str.format()
字串的方法需要更多的手動操作。您仍將使用{
和}
標記變數將被替換的位置,並且可以提供詳細的格式化指令,但您還需要提供要格式化的資訊
最後,您可以使用字串切片和連線操作自己完成所有字串處理,以建立您可以想象的任何佈局。字串型別有一些方法可以執行將字串填充到給定列寬的有用操作。
當您不需要花哨的輸出但只是想快速顯示某些變數以進行除錯時,您可以將任何值轉換為帶有repr()
或者str()
函式的字串
該str()
函式用於返回值相當於人類可讀的值的表示,同時repr()
用於生成可由直譯器讀取的表示(或者SyntaxError
如果沒有等效語法則強制執行)。對於沒有特定人類消費表示的物件,str()
將返回相同的值repr()
。許多值,例如數字或結構(如集合和字典),使用任一函式都具有相同的表示。特別是字串有兩個不同的表示。
該string
模組包含一個Template
類,它提供了另一種將值替換為字串的方法,使用佔位符, $x
並用字典中的值替換它們,但提供的格式控制要少得多
讀寫檔案
open()
返回一個檔案物件,最常用的有兩個引數:。open(filename, mode)
第一個引數是包含檔名的字串。第二個引數是另一個字串,其中包含一些描述檔案使用方式的字元。 模式可以是'r'
僅讀取檔案時,'w'
僅寫入(將刪除同名的現有檔案),並 'a'
開啟檔案進行追加; 寫入檔案的任何資料都會自動新增到最後。 'r+'
通常,檔案以文字模式開啟,這意味著您從檔案讀取和寫入檔案,這些檔案以特定編碼進行編碼。如果未指定編碼,則預設值取決於平臺(請參閱參考資料 open()
)。'b'
附加到模式後以二進位制模式開啟檔案 :現在以bytes物件的形式讀取和寫入資料。此模式應用於所有不包含文字的檔案。
在文字模式下,讀取時的預設設定是將平臺特定的行結尾(\n
在Unix上,\r\n
在Windows上)轉換為just \n
。在文字模式下寫入時,預設設定是將事件的發生轉換\n
為特定於平臺的行結尾。這幕後的修改檔案資料精細的文字檔案,但會喜歡,在破壞了二進位制資料 JPEG
或EXE
檔案。在讀取和寫入此類檔案時要非常小心地使用二進位制模式。
with
在處理檔案物件時,最好使用關鍵字。優點是檔案在套件完成後正確關閉,即使在某個時刻引發了異常。使用with
也比寫相當於短得多try
- finally
塊:
如果您沒有使用該with
關鍵字,那麼您應該呼叫 f.close()
以關閉該檔案並立即釋放它使用的任何系統資源。如果您沒有顯式關閉檔案,Python的垃圾收集器最終將銷燬該物件併為您關閉開啟的檔案,但該檔案可能會保持開啟狀態一段時間。另一個風險是不同的Python實現將在不同的時間進行清理。
通過with
語句或通過呼叫關閉檔案物件後file.close()
,繼續使用該檔案物件將自動失敗。
with 關鍵字與closed方法不需要同時使用 因為當使用with關鍵字後會自動關閉當前檔案,當使用with關鍵字後在對檔案操作會丟擲異常
檔案物件的方法
本節中的其餘示例將假定file為
已建立的檔案物件
要讀取檔案的內容,請呼叫file.read(size)
,讀取一些資料並將其作為字串(在文字模式下)或位元組物件(在二進位制模式下)返回。 size是可選的數字引數。當省略size或negative時,將讀取並返回檔案的全部內容; 如果檔案的大小是機器記憶體的兩倍,那麼這就是你的問題。否則,最多讀取並返回大小位元組。如果已到達檔案末尾,file.read()
則返回空字串(''
)。
等效於
這是記憶體高效,快速,並極為簡單的程式碼,如果要讀取列表中檔案的所有行,也可以使用 list(f)
或f.readlines()
。
file.write(string)
將string的內容寫入檔案,返回寫入的字元數。
注意此時需要指定有寫許可權,否則將丟擲異常
在編寫之前,需要將其他型別的物件轉換為字串(在文字模式下)或位元組物件(在二進位制模式下):
file.tell()
返回一個整數,表示為二進位制模式下檔案開頭的位元組數和文字模式下的不透明數字(就是當前檔案內容的位元組總數)。
使用儲存結構化資料json
可以輕鬆地將字串寫入檔案並從檔案中讀取。數字需要更多的努力,因為該read()
方法只返回字串,必須將其傳遞給類似的函式int()
,它接受類似字串'123'
並返回其數值123.當您想要儲存更復雜的資料型別(如巢狀列表和字典,手工解析和序列化變得複雜。
Python允許您使用稱為JSON(JavaScript Object Notation)的流行資料交換格式,而不是讓使用者不斷編寫和除錯程式碼以將複雜的資料型別儲存到檔案中。呼叫的標準模組json
可以採用Python資料層次結構,並將它們轉換為字串表示形式; 這個過程稱為序列化。從字串表示中重建資料稱為反序列化。在序列化和反序列化之間,表示物件的字串可能已儲存在檔案或資料中,或通過網路連線傳送到某個遠端機器。
注意
JSON格式通常被現代應用程式用於允許資料交換。許多程式設計師已經熟悉它,這使其成為互操作性的良好選擇
如果您有一個物件x
,則可以使用一行簡單的程式碼檢視其JSON字串表示:
dumps()
呼叫該函式的另一個變體dump()
,只是將物件序列化為文字檔案。因此,如果file
是一個 文字檔案,物件為寫入開啟,我們可以這樣做:
注意:操作檔案時一定要注意許可權設定
讀取檔案
這種簡單的序列化技術可以處理列表和字典,但是在JSON中序列化任意類例項需要額外的努力。該json
模組的參考包含對此的解釋。