【愚公系列】2021年12月 Python教學課程 25-Python文件讀寫

      網友投稿 870 2025-04-01

      前言

      寫程序過程中,我們做的一切操作,都是在內存里進行的。如果一旦斷電或發生意外,那么我們的工作成果將瞬間消失。們還缺少將數據在本地文件系統進行持久化的能力,白話講就是文件的讀寫能力。

      Python 內置了一個 open()方法,用于對文件進行讀寫操作。使用 open()方法操作文件就像把大象塞進冰箱一樣,可以分三步走,一是打開文件,二是操作文件,三是關閉文件。

      open()方法的返回值是一個 file 對象,可以將它賦值給一個變量。其基本語法格式為:

      f = open(filename, mode)

      其中,

      filename:一個包含了你要訪問的文件名稱的字符串值,通常是一個文件路徑。

      mode:打開文件的模式,有很多種,默認是只讀方式 r。

      一個簡單的例子:

      # 打開一個文件 f = open("foo.txt", "w") f.write("Python 是一種非常好的語言。\n 我喜歡 Python!!\n") # 關閉打開的文件 f.close()

      打開模式:

      一、 b 模式

      二進制模式,通常用來讀取圖片、視頻等二進制文件。注意,它在讀寫的時候是以bytes 類型讀寫的,因此獲得的是一個 bytes 對象而不是字符串。在這個讀寫過程中,需要自己指定編碼格式。在使用帶 b 的模式時一定要注意傳入的數據類型,確保為bytes 類型。

      s = 'this is a test' b = bytes(s,encoding='utf-8') f = open('test.txt','w') f.write(s) ##這樣沒問題,正常寫入了文件。 ##------------------------------------------------- s = 'this is a test' b = bytes(s,encoding='utf-8') f = open('test.txt','wb') ##注意多了個 b f.write(s) ##報錯 TypeError: a bytes-like object is required, not 'str' ##意思是它需要一個 bytes 類型數據,你卻給了個字符串 ##--------------------------------------------------- s = 'this is a test' b = bytes(s,encoding='utf-8') f = open('test.txt','wb') ##注意多了個 b f.write(b) ##將變量 b 傳給它,b 是個 bytes 類型

      二、 + 模式:

      對于 w+模式,在讀寫之前都會清空文件的內容,建議不要使用!

      對于 a+模式,永遠只能在文件的末尾寫入,有局限性,建議不要使用!

      對于 r+模式,也就是讀寫模式,配合 seek()和 tell()方法,可以實現更多操作。

      三、 編碼問題

      要讀取非 UTF-8 編碼的文件,需要給 open()函數傳入 encoding 參數,例如,讀取GBK 編碼的文件:

      >>> f = open('gbk.txt', 'r', encoding='gbk') >>> f.read() 'GBK'

      遇到有些編碼不規范的文件,可能會拋出 UnicodeDecodeError 異常,這表示在文件中可能夾雜了一些非法編碼的字符。遇到這種情況,可以提供 errors 參數,表示如果遇到編碼錯誤后如何處理。

      >>> f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')

      四、 文件對象操作

      每當我們用 open 方法打開一個文件時,將返回一個文件對象。這個對象內置了很多操作方法。下面假設,已經打開了一個 f 文件對象。

      1. f.read(size)

      讀取一定大小的數據, 然后作為字符串或字節對象返回。size 是一個可選的數字類型的參數,用于指定讀取的數據量。當 size 被忽略了或者為負值,那么該文件的所有內容都將被讀取并且返回。

      f = open("1.txt", "r") str = f.read() print(str) f.close()

      如果文件體積較大,請不要使用 read()方法一次性讀入內存,而是 read(512)這種一點一點的讀。

      2. f.readline()

      從文件中讀取一行內容。換行符為’\n’。如果返回一個空字符串,說明已經已經讀取到最后一行。這種方法,通常是讀一行,處理一行,并且不能回頭,只能前進,讀過的行不能再讀了。

      f = open("1.txt", "r") str = f.readline() print(str) f.close()

      3. f.readlines()

      將文件中所有的行,一行一行全部讀入一個列表內,按順序一個一個作為列表的元素,并返回這個列表。readlines 方法會一次性將文件全部讀入內存,所以也存在一定的風險。但是它有個好處,每行都保存在列表里,可以隨意存取。

      f = open("1.txt", "r") a = f.readlines() print(a) f.close()

      4. 遍歷文件

      實際上,更多的時候,我們將文件對象作為一個迭代器來使用。

      # 打開一個文件 f = open("1.txt", "r") for line in f: print(line, end='') f.close()

      這個方法很簡單, 不需要將文件一次性讀出,但是同樣沒有提供一個很好的控制,與readline 方法一樣只能前進,不能回退。

      幾種不同的讀取和遍歷文件的方法比較:

      如果文件很小,read()一次性讀取最方便

      如果不能確定文件大小,反復調用 read(size)比較保險

      如果是配置文件,調用 readlines()最方便

      普通情況,使用 for 循環更好,速度更快

      5. f.write()

      將字符串或 bytes 類型的數據寫入文件內。write()動作可以多次重復進行,其實都是在內存中的操作,并不會立刻寫回硬盤,直到執行 close()方法后,才會將所有的寫入操作反映到硬盤上。在這過程中,如果想將內存中的修改,立刻保存到硬盤上,可以使用 f.flush()方法,但這可能造成數據的不一致。

      # 打開一個文件 f = open("/tmp/foo.txt", "w") f.write("Python 是一種非常好的語言。\n 我喜歡 Python!!\n") # 關閉打開的文件 f.close()

      6. f.tell()

      返回文件讀寫指針當前所處的位置,它是從文件開頭開始算起的字節數。一定要注意了,是字節數,不是字符數。

      7. f.seek()

      如果要改變位置指針的位置, 可以使用 f.seek(offset, from_what)方法。seek()經常和tell()方法配合使用。

      from_what 的值,如果是 0 表示從文件開頭計算,如果是 1 表示從文件讀寫指針的當前位置開始計算,2 表示從文件的結尾開始計算,默認為 0,例如:

      offset:表示偏移量。

      seek(x,0) : 從起始位置即文件首行首字符開始移動 x 個字符

      【愚公系列】2021年12月 Python教學課程 25-Python文件讀寫

      seek(x,1) : 表示從當前位置往后移動 x 個字符

      seek(-x,2):表示從文件的結尾往前移動 x 個字符

      看一個例子:

      >>> f = open("d:\\1.txt", "rb+") >>> f.write(b"1232312adsfalafds") 17 >>> f.tell() 17 >>> f.seek(5) 5 >>> f.read(1) b'1' >>> f.seek(-3, 2) 14 >>> f.read(1) b'f'

      8. f.close()

      關閉文件對象。當處理完一個文件后,調用 f.close()來關閉文件并釋放系統的資源。文件關閉后,如果嘗試再次調用該文件對象,則會拋出異常。忘記調用 close()的后果是數據可能只寫了一部分到磁盤,剩下的丟失了,或者更糟糕的結果。也就是說大象塞進冰箱后,一定不要忘記關上冰箱的門。

      五、 with 關鍵字

      with 關鍵字用于 Python 的上下文管理器機制。為了防止諸如 open 這一類文件打開方法在操作過程出現異常或錯誤,或者最后忘了執行 close 方法,文件非正常關閉等可能導致文件泄露、破壞的問題。Python 提供了 with 這個上下文管理器機制,保證文件會被正常關閉。在它的管理下,不需要再寫 close 語句。注意縮進。

      with open('test.txt', 'w') as f: f.write('Hello, world!')

      with 支持同時打開多個文件:

      with open('log1') as obj1, open('log2','w') as obj2: s=obj1.read() obj2.write(s)

      5G教育 Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:飛利浦與華為攜手推動醫療行業云化
      下一篇:word文檔實現快速格式化的重要工具是什么?(在word文檔實現快速格式化的重要工具是什么)
      相關文章
      亚洲熟女综合色一区二区三区| 亚洲一久久久久久久久| 狼人大香伊蕉国产WWW亚洲| 久久亚洲精品国产亚洲老地址| 久久av无码专区亚洲av桃花岛| 亚洲av色福利天堂| 亚洲处破女AV日韩精品| 亚洲精品乱码久久久久久按摩 | 亚洲AV无码不卡在线播放| 亚洲精品乱码久久久久久蜜桃不卡| 亚洲精品高清无码视频| 亚洲成AV人片天堂网无码| 久久久久亚洲AV成人无码网站| 亚洲AV无码专区电影在线观看| 亚洲AV无码久久精品成人| 亚洲午夜精品久久久久久人妖| 亚洲精品人成在线观看| 337p欧洲亚洲大胆艺术| 亚洲精品欧洲精品| 亚洲午夜精品一区二区公牛电影院 | 亚洲AV综合色区无码一区爱AV| 亚洲成av人在线视| 日韩精品一区二区亚洲AV观看| 亚洲欧洲免费视频| 亚洲综合在线观看视频| 亚洲国产精品久久网午夜| 国产精品久久亚洲不卡动漫 | 亚洲乱码中文字幕久久孕妇黑人 | 亚洲精品无码不卡在线播放HE| 亚洲va久久久噜噜噜久久| 2022年亚洲午夜一区二区福利| 亚洲理论精品午夜电影| 亚洲综合伊人制服丝袜美腿| 亚洲欧美黑人猛交群| 国产精品亚洲一区二区三区在线观看| 亚洲日韩中文字幕日韩在线| 国产成A人亚洲精V品无码| 久久精品亚洲精品国产色婷| 亚洲91精品麻豆国产系列在线| 亚洲永久网址在线观看| 国产亚洲福利精品一区二区|