當前位置:
首頁 > 最新 > python高級編程精講

python高級編程精講

格式化輸出

通常,你想要對輸出做更多的格式控制,而不是簡單的列印使用空格分隔的值。有兩種方法可以格式化你的輸出:第一種方法是由你自己處理整個字元串,通過使用字元串切割和連接操作可以創建任何你想要的輸出形式。string 類型包含一些將字元串填充到指定列寬度的有用操作,隨後就會討論這些。第二種方法是使用 str.format() 方法。

標準模塊 string 包括了一些操作,將字元串填充入給定列時,這些操作很有用。隨後我們會討論這部分內容。第二種方法是使用 Template 方法。

當然,還有一個問題,如何將值轉化為字元串?很幸運,Python 有辦法將任意值轉為字元串:將它傳入repr() 或 str() 函數。

函數 str() 用於將值轉化為適於人閱讀的形式,而 repr() 轉化為供解釋器讀取的形式(如果沒有等價的語法,則會發生 SyntaxError 異常)某對象沒有適於人閱讀的解釋形式的話,str() 會返回與 repr() 等同的值。很多類型,諸如數值或鏈表、字典這樣的結構,針對各函數都有著統一的解讀方式。字元串和浮點數,有著獨特的解讀方式。

下面有些例子:

請點擊此處輸入圖片描述

有兩種方式可以寫平方和立方表:

請點擊此處輸入圖片描述

(注意第一個例子,print() 在每列之間加了一個空格,它總是在參數間加入空格。)

以上是一個 str.rjust() 方法的演示,它把字元串輸出到一列,並通過向左側填充空格來使其右對齊。類似的方法還有 str.ljust() 和 str.center()。這些函數只是輸出新的字元串,並不改變什麼。如果輸出的字元串太長,它們也不會截斷它,而是原樣輸出,這會使你的輸出格式變得混亂,不過總強過另一種選擇(截斷字元串),因為那樣會產生錯誤的輸出值(如果你確實需要截斷它,可以使用切割操作,例如:x.ljust(n)[:n] )。 小編為大家推薦一個學習交流群:308754087,群里有人都快滿了~大家遇到啥問題都可以在裡面交流!是一個非常好的學習交流地方~欲進從速歐~各種PDF等你來下載,全部免費,只為幫助大家快速入門。

還有另一個方法, str.zfill() 它用於向數值的字元串表達左側填充 0。該函數可以正確理解正負號:

請點擊此處輸入圖片描述

方法 str.format() 的基本用法如下:

請點擊此處輸入圖片描述

大括弧和其中的字元會被替換成傳入 str.format() 的參數。大括弧中的數值指明使用傳入 str.format() 方法的對象中的哪一個:

請點擊此處輸入圖片描述

如果在 str.format() 調用時使用關鍵字參數,可以通過參數名來引用值:

請點擊此處輸入圖片描述

位置參數和關鍵字參數可以隨意組合

請點擊此處輸入圖片描述

"!a" (應用 ascii()), "!s" (應用 str() )和 "!r" (應用 repr() )可以在格式化之前轉換值:

請點擊此處輸入圖片描述

欄位名後允許可選的 ":" 和格式指令。這允許對值的格式化加以更深入的控制。下例將 Pi 轉為三位精度。

請點擊此處輸入圖片描述

在欄位後的 ":" 後面加一個整數會限定該欄位的最小寬度,這在美化表格時很有用

請點擊此處輸入圖片描述

如果你有個實在是很長的格式化字元串,不想分割它。如果你可以用命名來引用被格式化的變數而不是位

置就好了。有個簡單的方法,可以傳入一個字典,用中括弧( "[]" )訪問它的鍵:

請點擊此處輸入圖片描述

也可以用 『**』 標誌將這個字典以關鍵字參數的方式傳入

請點擊此處輸入圖片描述

這種方式與新的內置函數 vars() 組合使用非常有效。該函數返回包含所有局部變數的字典。要進一步了解字元串格式化方法 str.format(),參見 格式字元串語法

舊式的字元串格式化

操作符 %也可以用於字元串格式化。它以類似 sprintf() -style 的方式解析左參數,將右參數應用於此, 得到格式化操作生成的字元串,例如:

請點擊此處輸入圖片描述

文件讀寫

函數 open() 返回 文件對象,通常的用法需要兩個參數: open(filename, mode) 。

>>> f = open("workfile", "w")

第一個參數是一個含有文件名的字元串。第二個參數也是一個字元串,含有描述如何使用該文件的幾個字元。mode 為 "r" 時表示只是讀取文件;"w" 表示只是寫入文件(已經存在的同名文件將被刪掉);"a"表示打開文件進行追加,寫入到文件中的任何數據將自動添加到末尾。 "r+" 表示打開文件進行讀取和寫 入。mode 參數是可選的,默認為 "r" 。

通常,文件以 文本 打開,這意味著,你從文件讀出和向文件寫入的字元串會被特定的編碼方式(默認是UTF-8)編碼。模式後面的 "b" 以 二進位模式 打開文件:數據會以位元組對象的形式讀出和寫入。這種模式應該用於所有不包含文本的文件。 在文本模式下,讀取時默認會將平台有關的行結束符(Unix上是
, Windows上是
)轉換為

在文本模式下寫入時,默認會將出現的
轉換成平台有關的行結束符。這種暗地裡的修改對 ASCII 文本 文件沒有問題,但會損壞 JPEG 或 EXE 這樣的二進位文件中的數據。使用二進位模式讀寫此類文件時要特 別小心。

文件對象方法

本節中的示例都默認文件對象 f 已經創建。

要讀取文件內容,需要調用 f.read(size) ,該方法讀取若干數量的數據並以字元串形式返回其內容,size 是 可選的數值,指定字元串長度。如果沒有指定 size 或者指定為負數,就會讀取並返回整個文件。當文件大小為當前機器內存兩倍時,就會產生問題。反之,會儘可能按比較大的 size 讀取和返回數據。如果到了文件末尾,f.read() 會返回一個空字元串(""):

請點擊此處輸入圖片描述

f.readline()從文件中讀取單獨一行,字元串結尾會自動加上一個換行符(
),只有當文件最後一行沒有以換行符結尾時,這一操作才會被忽略。這樣返回值就不會有混淆,如果 f.readline() 返回一個空字元串,那就表示到達了文件末尾,如果是一個空行,就會描述為 "
" ,一個只包含換行符的字元串

請點擊此處輸入圖片描述

你可以循環遍歷文件對象來讀取文件中的每一行。這是一種內存高效、快速,並且代碼簡介的方式:

請點擊此處輸入圖片描述

如果你想把文件中的所有行讀到一個列表中,你也可以使用 list(f) 或者 f.readlines() 。 f.write(string) 方法將 string 的內容寫入文件,並返回寫入字元的長度:

請點擊此處輸入圖片描述

想要寫入其他非字元串內容,首先要將它轉換為字元串

請點擊此處輸入圖片描述

f.tell() 返回一個整數,代表文件對象在文件中的指針位置,該數值計量了自文件開頭到指針處的比特 數。需要改變文件對象指針話話,使用 f.seek(offset,from_what) 。指針在該操作中從指定的引用位置移動 offset 比特,引用位置由 from_what 參數指定。 from_what 值為 0 表示自文件起始處開始,1 表示自當前文件指針位置開始,2 表示自文件末尾開始。from_what 可以忽略,其默認值為零,此時從文件頭開始

請點擊此處輸入圖片描述

在文本文件中(沒有以 b 模式打開),只允許從文件頭開始尋找(有個例外是用 seek(0, 2) 尋找文件的 最末尾處)而且合法的 偏移 值只能是 f.tell() 返回的值或者是零。其它任何 偏移 值都會產生未定義的行為。

當你使用完一個文件時,調用 f.close() 方法就可以關閉它並釋放其佔用的所有系統資源。在調用 f.close() 方法後,試圖再次使用文件對象將會自動失敗。

請點擊此處輸入圖片描述

用關鍵字 with 處理文件對象是個好習慣。它的先進之處在於文件用完後會自動關閉,就算髮生異常也沒關係。它是 try-finally 塊的簡寫:

with open("workfile", "r") as f:

read_data = f.read()

f.closed

True

文件對象還有一些不太常用的附加方法,比如 isatty()和 truncate() 在庫參考手冊中有文件對象的完整指南。

使用 json 存儲結構化數據

從文件中讀寫字元串很容易。數值就要多費點兒周折,因為 read() 方法只會返回字元串,應將其傳入 int()這樣的函數,就可以將 "123" 這樣的字元串轉換為對應的數值 123。當你想要保存更為複雜的數據類型, 例如嵌套的列表和字典,手工解析和序列化它們將變得更複雜。

好在用戶不是非得自己編寫和調試保存複雜數據類型的代碼,Python 允許你使用常用的數據交換格式JSON(JavaScript Object Notation)。標準模塊 json 可以接受 Python 數據結構,並將它們轉換為字元串表示形式;此過程稱為 序列化。從字元串表示形式重新構建數據結構稱為 反序列化。序列化和反序列化的過程中,表示該對象的字元串可以存儲在文件或數據中,也可以通過網路連接傳送給遠程的機器。

JSON 格式經常用於現代應用程序中進行數據交換。許多程序員都已經熟悉它了,使它成為相互協作的一個不錯的選擇。

如果你有一個對象 x ,你可以用簡單的一行代碼查看其 JSON 字元串表示形式

>>> json.dumps([1, "simple", "list"])

"[1, "simple", "list"]"

dumps() 函數的另外一個變體 dump(),直接將對象序列化到一個文件。所以如果 f 是為寫入而打開的一個 文件對象,我們可以這樣做:

json.dump(x, f)

為了重新解碼對象,如果 f 是為讀取而打開的 文件對象:

x = json.load(f)

這種簡單的序列化技術可以處理列表和字典,但序列化任意類實例為 JSON 需要一點額外的努力。 json 模塊的手冊對此有詳細的解釋。

pickle - pickle 模塊

與 JSON 不同,pickle 是一個協議,它允許任意複雜的 Python 對象的序列化。因此,它只能用於 Python 而不能用來與其他語言編寫的應用程序進行通信。默認情況下它也是不安全的:如果數據由熟練的攻擊者精心設計, 反序列化來自一個不受信任源的 pickle 數據可以執行任意代碼。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 魯濱遜 的精彩文章:

python就業全方位解析

TAG:魯濱遜 |