6、python基础:文件输入输出详解
文章目錄
- 前言
- 一、更復雜的輸出格式
- 二、字符串 format() 方法
- 三、讀寫文件
- 四、文件對象的方法
- 五、使用 json 保存結構化數據
- python官方文檔鏈接
- python官方標準庫鏈接
前言
余生平,怎一個懶字了得。
一、更復雜的輸出格式
對輸出格式的控制不只是打印空格分隔的值,還需要更多方式。格式化輸出包括以下幾種方法。
使用 格式化字符串字面值 ,要在字符串開頭的引號/三引號前添加 f 或 F 。在這種字符串中,可以在 { 和 } 字符之間輸入引用的變量,或字面值的 Python 表達式。 >>> year = 2016 >>> event = 'Referendum' >>> f'Results of the {year} {event}' 'Results of the 2016 Referendum'字符串的 str.format() 方法需要更多手動操作。該方法也用 { 和 } 標記替換變量的位置,雖然這種方法支持詳細的格式化指令,但需要提供格式化信息。 >>> yes_votes = 42_572_654 >>> no_votes = 43_132_495 >>> percentage = yes_votes / (yes_votes + no_votes) >>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) ' 42572654 YES votes 49.67%'最后,還可以用字符串切片和合并操作完成字符串處理操作,創建任何排版布局。字符串類型還支持將字符串按給定列寬進行填充,這些方法也很有用。如果不需要花哨的輸出,只想快速顯示變量進行調試,可以用 repr() 或 str() 函數把值轉化為字符串。
str() 函數返回供人閱讀的值,repr() 則生成適于解釋器讀取的值(如果沒有等效的語法,則強制執行 SyntaxError)。對于沒有支持供人閱讀展示結果的對象, str() 返回與 repr() 相同的值。一般情況下,數字、列表或字典等結構的值,使用這兩個函數輸出的表現形式是一樣的。字符串有兩種不同的表現形式。
示例如下:
>>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hello, world.'" >>> str(1/7) '0.14285714285714285' >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print(s) The value of x is 32.5, and y is 40000... >>> # The repr() of a string adds string quotes and backslashes: ... hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # The argument to repr() may be any Python object: ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))"string 模塊包含 Template 類,提供了將值替換為字符串的另一種方法。該類使用 $x 占位符,并用字典的值進行替換,但對格式控制的支持比較有限。二、字符串 format() 方法
str.format() 方法的基本用法如下所示:
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) We are the knights who say "Ni!"花括號及之內的字符(稱為格式字段)被替換為傳遞給 str.format() 方法的對象。花括號中的數字表示傳遞給 str.format() 方法的對象所在的位置。
>>> print('{0} and {1}'.format('spam', 'eggs')) spam and eggs >>> print('{1} and {0}'.format('spam', 'eggs')) eggs and spamstr.format() 方法中使用關鍵字參數名引用值。
>>> print('This {food} is {adjective}.'.format( ... food='spam', adjective='absolutely horrible')) This spam is absolutely horrible.位置參數和關鍵字參數可以任意組合:
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',other='Georg')) The story of Bill, Manfred, and Georg.如果不想分拆較長的格式字符串,最好按名稱引用變量進行格式化,不要按位置。這項操作可以通過傳遞字典,并用方括號 ‘[]’ 訪問鍵來完成
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ' ... 'Dcab: {0[Dcab]:d}'.format(table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678也可以用 ‘**’ 符號,把 table 當作傳遞的關鍵字參數。
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678與內置函數 vars() 結合使用時,這種方式非常實用,可以返回包含所有局部變量的字典。
例如,下面的代碼生成一組整齊的列,包含給定整數及其平方與立
>>> for x in range(1, 11): ... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) ...1 1 12 4 83 9 274 16 645 25 1256 36 2167 49 3438 64 5129 81 729 10 100 100三、讀寫文件
第一個實參是文件名字符串。第二個實參是包含描述文件使用方式字符的字符串。mode 的值包括 ‘r’ ,表示文件只能讀取;‘w’ 表示只能寫入(現有同名文件會被覆蓋);‘a’ 表示打開文件并追加內容,任何寫入的數據會自動添加到文件末尾?!畆+’ 表示打開文件進行讀寫。mode 實參是可選的,省略時的默認值為 ‘r’。
>>> f = open('workfile', 'w', encoding="utf-8")在文本模式下讀取文件時,默認把平臺特定的行結束符(Unix 上為 \n, Windows 上為 \r\n)轉換為 \n。在文本模式下寫入數據時,默認把 \n 轉換回平臺特定結束符。這種操作方式在后臺修改文件數據對文本文件來說沒有問題,但會破壞 JPEG 或 EXE 等二進制文件中的數據。注意,在讀寫此類文件時,一定要使用二進制模式。
在處理文件對象時,最好使用 with 關鍵字。優點是,子句體結束后,文件會正確關閉,即便觸發異常也可以。而且,使用 with 相比等效的 try-finally 代碼塊要簡短得多:
>>> with open('workfile', encoding="utf-8") as f: ... read_data = f.read()>>> # We can check that the file has been automatically closed. >>> f.closed True如果沒有使用 with 關鍵字,則應調用 f.close() 關閉文件,即可釋放文件占用的系統資源。
警告: 調用 f.write() 時,未使用 with 關鍵字,或未調用 f.close(),即使程序正常退出,也可能 導致 f.write() 的參數沒有完全寫入磁盤。
四、文件對象的方法
本節下文中的例子假定已創建 f 文件對象。
f.read(size) 可用于讀取文件內容,它會讀取一些數據,并返回字符串(文本模式),或字節串對象(在二進制模式下)。 size 是可選的數值參數。省略 size 或 size 為負數時,讀取并返回整個文件的內容;文件大小是內存的兩倍時,會出現問題。size 取其他值時,讀取并返回最多 size 個字符(文本模式)或 size 個字節(二進制模式)。如已到達文件末尾,f.read() 返回空字符串(‘’)。
f.readline() 從文件中讀取單行數據;字符串末尾保留換行符(\n),只有在文件不以換行符結尾時,文件的最后一行才會省略換行符。這種方式讓返回值清晰明確;只要 f.readline() 返回空字符串,就表示已經到達了文件末尾,空行使用 ‘\n’ 表示,該字符串只包含一個換行符。
>>> f.readline() 'This is the first line of the file.\n' >>> f.readline() 'Second line of the file\n' >>> f.readline() ''從文件中讀取多行時,可以用循環遍歷整個文件對象。這種操作能高效利用內存,快速,且代碼簡單:
>>> for line in f: ... print(line, end='') ... This is the first line of the file. Second line of the file如需以列表形式讀取文件中的所有行,可以用 list(f) 或 f.readlines()。
f.write(string) 把 string 的內容寫入文件,并返回寫入的字符數。
>>> f.write('This is a test\n') 15寫入其他類型的對象前,要先把它們轉化為字符串(文本模式)或字節對象(二進制模式):
>>> value = ('the answer', 42) >>> s = str(value) # convert the tuple to string >>> f.write(s) 18f.tell() 返回整數,給出文件對象在文件中的當前位置,表示為二進制模式下時從文件開始的字節數,以及文本模式下的意義不明的數字。
f.seek(offset, whence) 可以改變文件對象的位置。通過向參考點添加 offset 計算位置;參考點由 whence 參數指定。 whence 值為 0 時,表示從文件開頭計算,1 表示使用當前文件位置,2 表示使用文件末尾作為參考點。省略 whence 時,其默認值為 0,即使用文件開頭作為參考點。
>>> f = open('workfile', 'rb+') >>> f.write(b'0123456789abcdef') 16 >>> f.seek(5) # Go to the 6th byte in the file 5 >>> f.read(1) b'5' >>> f.seek(-3, 2) # Go to the 3rd byte before the end 13 >>> f.read(1) b'd'在文本文件(模式字符串未使用 b 時打開的文件)中,只允許相對于文件開頭搜索(使用 seek(0, 2) 搜索到文件末尾是個例外),唯一有效的 offset 值是能從 f.tell() 中返回的,或 0。其他 offset 值都會產生未定義的行為。
五、使用 json 保存結構化數據
從文件寫入或讀取字符串很簡單,數字則稍顯麻煩,因為 read() 方法只返回字符串,這些字符串必須傳遞給 int() 這樣的函數,接受 ‘123’ 這樣的字符串,并返回數字值 123。保存嵌套列表、字典等復雜數據類型時,手動解析和序列化的操作非常復雜。
Python 支持 JSON (JavaScript Object Notation) 這種流行數據交換格式,用戶無需沒完沒了地編寫、調試代碼,才能把復雜的數據類型保存到文件。json 標準模塊采用 Python 數據層次結構,并將之轉換為字符串表示形式;這個過程稱為 serializing (序列化)。從字符串表示中重建數據稱為 deserializing (解序化)。在序列化和解序化之間,表示對象的字符串可能已經存儲在文件或數據中,或通過網絡連接發送到遠方 的機器。
只需一行簡單的代碼即可查看某個對象的 JSON 字符串表現形式:
dumps() 函數還有一個變體, dump() ,它只將對象序列化為 text file 。因此,如果 f 是 text file 對象,可以這樣做:
json.dump(x, f)python官方文檔鏈接
python官方標準庫鏈接
總結
以上是生活随笔為你收集整理的6、python基础:文件输入输出详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【毕业设计】基于stm32的示波器设计与
- 下一篇: c语言continue作用于,c语言co