Python Basic - Python open() 、closed()、write()、read()、 readline()、readlines()、with与文件进行交互
文章目錄
- 文件的操作
- open()建立一個文件對象
- 語法
- butlin關于open()方法的英文解釋
- open() 方法支持參數
- file :文件的路徑 可以是絕對路徑,也可以是相對路徑
- mode :操作文件的模式,可選參數,默認為“r”
- buffering =
- encoding
- errors
- newline :指定換行符
- closefd 指定關閉文件描述符
- opener
- 文件對象的各類操作方法
- 各類方法示例:
- read()
- widowns下file使用相對路徑
- windows下file使用絕對路徑
- 指定讀取字符個數
- readline()
- 不帶參數
- 帶數字參數
- 多次readline() 并觀察光標(指針)的計數
- readlines()
- 不帶參數
- 帶1個數字參數(數字為1小于一行的字符數)
- 帶1個參數(每數字都小于每行的字符個數)
- 帶1個參數(大于一行的字符個數)
- mode="w":--探索w模式默認的一上來就truncate()操作
- write()--往文件內寫內容
- write()--探索write()的覆蓋寫操作
- seek() 設置指針(光標)的位置
- tell() 獲取當前指針(光標)的位置
- flush() 將緩存中內容寫到磁盤,刷寫磁盤--打印一個進度條顯示
- 方法一:使用sys模塊的stdout()
- truncate() 截短
- truncate 示例:探索truncate只截取指針(光標)之后的內容
- fileno() 查看當前文件的“文件描述符”
- readable()-判斷文件是否可讀
- writeable()-判斷文件是否可寫
- 遍歷文件內容
- 直接for循環每一行內容
- 直接for循環readlines()每一行內容(去掉print的換行符)
- 直接for 循環file的每一行
- 遍歷并修改指定行內容
- 將文件轉成“枚舉”后打印行號
- with 語句
能調用方法的只有對象,文件本身也是一個對象
文件的操作
文件的操作過程:
- 養成良好的習慣,文件用完之后要使用“close()”關閉文件,也可以使用“with” 來打開文件,用完之后會自動關閉相應的文件
open()建立一個文件對象
- 用于打開一個文件,并賦以相應的權限,打開的內容可以使用一個變量進行接收
語法
open ( file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None )butlin關于open()方法的英文解釋
open() 方法支持參數
file :文件的路徑 可以是絕對路徑,也可以是相對路徑
+ 絕對路徑:從文件系統的根開始 + 相對路徑:相對于程序文件目錄mode :操作文件的模式,可選參數,默認為“r”
+ r: read--讀文件操作,如果只有“r”參數,在文本模式中,文件是只讀不可寫的 + w: write--寫文件操作,如果是只有“w”參數,文件是只寫不可讀的,單獨使用此參數請注意,一旦創建這個文件對象,且有寫操作,則直接清空文件內容,如果沒有這個文件,則創建這個文件。原文為“open for writing, truncating the file first”,一旦開始,首先就截短文件為空白。 + x: exclusive 如果不存在這個文件就創建,如果文件已經存在則打開打敗。可用于創建文件前先判斷此文件是否已經存在 + a: append--往后面追加,也不能讀,與“w”一樣,都是寫,不同之處在于,無論當前的seek位置(指針位置,或者叫光標的位置)在哪里,a是往文件最后追加,默認情況下往最后直接寫,建議在寫之前先加一個“\n”換行符。 + b: 二進制模式 + t: 文本模式(默認模式) + +: 打開文件用于更新(讀和寫)- r+: 讀寫模式,從指針所在的位置往后寫,往哪兒寫要看指針所在位置,指針所在位置可以使用tell()方法查詢- w+: 寫讀模式,寫完一個數據后,指針就移到寫的末尾,如果此時再讀,要看后面有沒有內容。或者使用seek() 調整光標的位置- a+: 追加讀模式,與寫一樣,需要看打針所在的位置,因為a默認是從文件尾部追加,所以讀就從此后讀,所以不調整光標默認讀到的是空白buffering =
+ 是一個可選的數字參數,用于設置緩存策略- 0 : 關閉緩存(僅允許在二進制模式中)- 1 :行緩存(僅在文本模式中可用)- >1 :用于指明緩存的字節大小 + 當沒有二進程文件緩存至指定大小的框中,默認策略如下:- 二進制文件 固定緩存大小- 緩存的大小使用一種探索式的嘗試從度層設備的“塊大小”反饋來設置默認的緩存大小(DEFAULT_BUFFER_SIZE)- 在許多系統中,緩存的典型大小是4字節或者8字節。encoding
+ 用于標明文件內字符編碼 + 在文本模式下,如果“encoding”沒有手動指定,將使用操作系統平臺默認的locale,python3 會通過“locale.getpreferredencoding(False)”函數來獲取當前平臺的默認編碼。 + 二進制模式下,讀寫都使用裸字節,就是原始的0101直接發過去,所以保留了原始的編碼。errors
+ 是一個可選項 + 用于指定怎么對“encoding”,"decoding"所遇到的錯誤 + 不能用于二進制模式 + 各種各樣的標準錯誤處理方法都可以使用“error()”函數進行處理,標準和名稱包含如下:- ignore : 忽略,**注意**:忽略編碼錯誤會導致數據丟失- strict :嚴格,編碼錯誤時,提高異常錯誤的值,默認的值為None與strict有同樣的功能- replace :替換,編碼錯誤時,生成一個替換的標記(如“?”),然后插入到原文中,會看起來很難看。- surrogateescape :+ 不知道咋翻譯:從單詞上看“代理逃逸”:如遇到編碼錯誤,將使用“Unicode”的私有編碼,范圍從“U+DC80” 到“ U+DCFF”的來替換錯誤字節到原位置+ 對于處理一些不知道編碼的文件會很有用。- xmlcharrefreplace:+ 僅用于寫文件時,編碼不支持的字符,將會使用一個合適的XML特性,如&#nnn;- backslashreplace :+ 使用Python的 逃逸符“\”來代替原先畸形的數據- namereplace:+ 僅用于寫文件,+ 使用“\N”來替換不支持的字符newline :指定換行符
- 僅用于“文本模式”
- 用于控制如何換行,就是說明一下文件的換行符:
- 換行符可以是:
- None
- "
- ‘\n’
- ‘\r’
- ‘\r\n’
- 如果從一個數據流中輸入數據:
- 換行符是None,使用的是通用的換行模式,一行的結束可以是‘\n’,’\r’或者是’\r\n’,在將數據返回給請求者之前,這些換行符將都被統一轉換成’\n’
- 如果是“(一個雙引號做為換行符),通用的模式被開啟,但是返回給請求都之前,不會被轉換
- 如果是其它的合法的值,輸出的行將僅用給定的換行符進行換行,并且換行符在返回給請求者之前不會被翻譯
- 如果是寫入輸出一個數據流:
- None: 任何’\n’ 換行符被轉換成系統默認的換行符,可使用“os.linesep” 替換
- “ 或者是‘\n’ :不會轉換
- 其它:所有的’\n’字符將被轉換成給定的換行符。
closefd 指定關閉文件描述符
- 如果closefd 是False 并且 ”文件描述符(file descriptor)不是文件名給定的,文件關閉后底層系統的描述符將被保持打開,文件名稱指定的closefd 為Ture(默認就是Ture) 否則會報出一個錯誤。
opener
文件對象的各類操作方法
-
read()
-
括號內有參數,什么都不加表示全讀出來
-
數字做為參數:按字位置,一次取一個字符,一個漢字也表示 一個字符
-
closed()
- 文件使用完后關閉文件的函數
-
write()
- 執行具體的寫文件操作,可接收參數
- 直接將寫入文件的內容當做參數:這種是“覆蓋寫”操作
- 如果有多個“write”方法操作,不會下一個覆蓋上一個的覆蓋寫,默認不換行的“追加寫”,如果需要換行則寫入一個“換行符\n”
-
readline()
- 按行讀取內容,不像read() 方法一樣按字符取。
- 只到換行符就知道此行結束了
- 出現多次則連接的往后讀,并不是重復的讀同一行,其實內部操作的“指針”定位
- 不帶任何表示一次讀一行
- 可輸入數字,表示一次性讀取多少字符,帶數字后與read比較像
- 注意
- 讀一次后會將光標或者叫指針移動到讀到的位置。
- readline() 可以出現多次,第二次讀就從第一次讀完成后的光標所在處開始讀(如下示例中有描述)
- 帶參數后并不是嚴格的一次輸出一整行
-
readlines()
- 多行讀
- 不帶參數一次輸出所有行
- 默認輸出為**列表**類型,原文本的一行為一個元素,一個元素一個下標。且輸出結尾包含換行符
- 一次性全部讀取到內存中,大文件不建議此操作。
- 數字做為參數表示:
- 還是按字符個數計算,表示一次讀取多少個字符,但是因為readlines()是列表輸出,所以一次必需輸出一行
- 只要輸入的數字小于1行的字符個數,則整行都輸出到列表
- 如果輸入的數字大于1行的字符的個數且小于兩行的字符個數,則輸出兩行到一個列表
- 具體可見下述示例
-
tell()
- 檢測當前光標的位置
- 調用此方法可以顯示此指針所在的位置
- 位置的數量是字符占用的字符位個數
- Python3-UTF-8中一個中文占用3個字符
-
seek()
- 接收的參數為數字,代表設置的指針的位置
- 調整指針所在的位置
-
flush()
- 調用后,馬上將內存緩沖區的數據同步到磁盤上永久存儲
- 寫進度條常用
-
truncate()
- 截短
- 括號內可跟數字參數,默認為-1
- 需要對文件有寫的權限,如果為-1或者為空,默認從最開始的位置截到最后
- 指定的數字為參數,截取多個個字符
- 如果打開文件的時候是“w"權限,,如果文本本身有內容,則打開的時候文件就清空了,再截取就是空白字符,
- 如果是程序中操作寫入字符后,再截短的,可正常截斷。
- 如果打開文件的時候是“a"權限,不會清空文檔。
-
fileno()
- 文件描述符
-
isatty()
- 判斷打開的文件是否是一個終端設備
- 返回值為布爾值
-
readable()
- 判斷打開的文件是否可讀
-
writeable()
- 判斷打開的文件是否可寫
各類方法示例:
- 支持參數
- int :可接受一個數字,用于指定只顯示多少個字符
- 需要注意的是,在read的時候,英文中文都只占一個位置
- int :可接受一個數字,用于指定只顯示多少個字符
read()
widowns下file使用相對路徑
file = open("少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.read())以下為輸出內容 """ 《少年游.本意》金庸 青衫磊落險峰行。玉壁月華明。馬疾香幽。崖高人遠。微步縠紋生。 誰家子弟誰家院。無計悔多情。虎嘯龍吟。換巢鸞鳳。劍氣碧煙橫。 """ file.close()file:直接填寫了文件名,所以這里使用的是相對路徑,與程序的目錄在一起
windows下file使用絕對路徑
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.read()) file.close()輸出內容與上面一樣,此處不張貼
指定讀取字符個數
import sys #導入一個sys模塊 print(sys.getdefaultencoding()) #打印當前python的默認編碼file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.read(8)) #打印前8個位置的字符""" utf-8 《少年游.本意》 """file.close()readline()
不帶參數
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.readline())file.close()###############以下為輸出內容############### """ 《少年游.本意》金庸 """帶數字參數
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.readline(5)) #打印前5個位置的字符file.close()###############以下為輸出內容############### """ 《少年游. """多次readline() 并觀察光標(指針)的計數
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print("還沒開始讀時:",file.tell()) print(file.readline(5)) print("第一次讀:",file.tell()) print(file.readline(5)) print("第二次讀:",file.tell()) print(file.readline(5)) print("第三次讀:",file.tell()) print(file.readline(5)) print("第四次讀:",file.tell()) print(file.readline(5)) print("第五次讀:",file.tell())file.close()###############以下為輸出內容############### """ 還沒開始讀時: 0 《少年游. 第一次讀: 15 本意》金庸 第二次讀: 30第三次讀: 32 青衫磊落險 第四次讀: 47 峰行。玉壁 第五次讀: 62"""readlines()
不帶參數
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.readlines())file.close()###############以下為輸出內容############### """ ['《少年游.本意》金庸\n', '青衫磊落險峰行。玉壁月華明。馬疾香幽。崖高人遠。微步縠紋生。\n', '誰家子弟誰家院。無計悔多情。虎嘯龍吟。換巢鸞鳳。劍氣碧煙橫。']"""帶1個數字參數(數字為1小于一行的字符數)
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.readlines(1)) print(file.readlines(1)) print(file.readlines(1))file.close()###############以下為輸出內容############### """ ['《少年游.本意》金庸\n'] ['青衫磊落險峰行。玉壁月華明。馬疾香幽。崖高人遠。微步縠紋生。\n'] ['誰家子弟誰家院。無計悔多情。虎嘯龍吟。換巢鸞鳳。劍氣碧煙橫。']帶1個參數(每數字都小于每行的字符個數)
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print("還沒開始讀時:",file.tell()) print(file.readlines(5)) print(file.readlines(5)) print(file.readlines(5)) print(file.readlines(5))file.close()###############以下為輸出內容############### """ 還沒開始讀時: 0 ['《少年游.本意》金庸\n'] ['青衫磊落險峰行。玉壁月華明。馬疾香幽。崖高人遠。微步縠紋生。\n'] ['誰家子弟誰家院。無計悔多情。虎嘯龍吟。換巢鸞鳳。劍氣碧煙橫。'] [] """帶1個參數(大于一行的字符個數)
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print("還沒開始讀時:",file.tell()) print(file.readlines(11)) print(file.readlines(5)) print(file.readlines(5)) print(file.readlines(5))file.close()###############以下為輸出內容############### """ 還沒開始讀時: 0 ['《少年游.本意》金庸\n', '青衫磊落險峰行。玉壁月華明。馬疾香幽。崖高人遠。微步縠紋生。\n'] ['誰家子弟誰家院。無計悔多情。虎嘯龍吟。換巢鸞鳳。劍氣碧煙橫。'] [] [] """mode=“w”:–探索w模式默認的一上來就truncate()操作
#################w之前先讀取文件的內容并輸出查看一遍###################### file = open("少年游本意",mode="r",encoding="utf8") #其它參數默認 print("w模式之前讀取文件內容:\n",file.read()) file.close() #查看之后一定要記得關閉這個打開操作#################open()操作執行w模式###################### file = open("少年游本意",mode="w",encoding="utf8") #其它參數默認file.close()#################w之后先讀取文件的內容并輸出查看一遍###################### file = open("少年游本意",mode="r",encoding="utf8") #其它參數默認 print("w模式之后讀取文件內容:\n",file.read()) file.close()###############以下為輸出內容############### """ w模式之前讀取文件內容:《少年游.本意》金庸 青衫磊落險峰行。玉壁月華明。馬疾香幽。崖高人遠。微步縠紋生。 誰家子弟誰家院。無計悔多情。虎嘯龍吟。換巢鸞鳳。劍氣碧煙橫。 w模式之后讀取文件內容:"""write()–往文件內寫內容
write()–探索write()的覆蓋寫操作
第一次使用wirite()寫一行,然后再寫一行,最后查看數據只有最后一次寫的一行。此功能可用于臨時的文件,數據不用保存,但是需要臨時寫一下文件。
seek() 設置指針(光標)的位置
tell() 獲取當前指針(光標)的位置
file = open("C:\少年游本意",mode="r",encoding="utf8") #其它參數默認 print("還沒開始讀時:",file.tell()) print(file.readline(5)) print("第一次讀:",file.tell()) print(file.readline(5)) print("第二次讀:",file.tell()) print(file.readline(5)) print("第三次讀:",file.tell()) print(file.readline(5)) print("第四次讀:",file.tell()) print(file.readline(5)) print("第五次讀:",file.tell())file.close()###############以下為輸出內容############### """ 還沒開始讀時: 0 《少年游. 第一次讀: 15 本意》金庸 第二次讀: 30第三次讀: 32 青衫磊落險 第四次讀: 47 峰行。玉壁 第五次讀: 62 """flush() 將緩存中內容寫到磁盤,刷寫磁盤–打印一個進度條顯示
方法一:使用sys模塊的stdout()
import sys,timefor i in range(50):sys.stdout.write("*")sys.stdout.flush()time.sleep(1) """ ************************************************** 結果是一個動態的效果 """方法二:使用print()方法
for i in range(50):print("*",flush=True,end="")time.sleep(1)truncate() 截短
truncate 示例:探索truncate只截取指針(光標)之后的內容
示例一:未使用seek定位光標內容
示例二:使用seek定位光標內容
fileno() 查看當前文件的“文件描述符”
file = open("少年游本意",mode="w",encoding="utf8") #其它參數默認 print(file.fileno()) file.close()file = open("少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.fileno()) file.close() """ 3 3 """readable()-判斷文件是否可讀
file = open("少年游本意",mode="w",encoding="utf8") #其它參數默認 print(file.readable()) print(file.writable()) file.close()file = open("少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.readable()) print(file.writable()) file.close() """ False True True False """writeable()-判斷文件是否可寫
file = open("少年游本意",mode="w",encoding="utf8") #其它參數默認 print(file.readable()) print(file.writable()) file.close()file = open("少年游本意",mode="r",encoding="utf8") #其它參數默認 print(file.readable()) print(file.writable()) file.close() """ False True True False """遍歷文件內容
直接for循環每一行內容
直接for循環readlines()每一行內容(去掉print的換行符)
直接for 循環file的每一行
直接循環file的每一行,此種方法并不像readlines()方法一樣,全部加入到內存,而是讀到該行的時候,將該行加入到內存,讀完之后從后從內存清空,對于特別大的文件必需使用此方法,否則內存不夠。for循環內部將file對象生成迭代器,不停的迭代新內容。對于文本來說,用一行取一行。使用完后內存釋放。建議使用這種機制
file = open("少年游本意",mode="r",encoding="utf8") for i in file:print(i,end="") # end="" 去掉print的換行符 """ 《少年游.本意》金庸 青衫磊落險峰行。 玉壁月華明。 馬疾香幽。 崖高人遠。 微步縠紋生。 誰家子弟誰家院。 無計悔多情。 虎嘯龍吟。 換巢鸞鳳。 劍氣碧煙橫。 """遍歷并修改指定行內容
.strip() 可以去掉換行符
file = open("少年游本意",mode="r",encoding="utf8") lineNumber = 0 for i in file:lineNumber+=1if lineNumber == 6:i = " ".join([i.strip(),"This is test Line.\n"])print(i,end="") """ 少年游.本意》金庸 青衫磊落險峰行。 玉壁月華明。 馬疾香幽。 崖高人遠。 微步縠紋生。 This is test Line. 誰家子弟誰家院。 無計悔多情。 虎嘯龍吟。 換巢鸞鳳。 劍氣碧煙橫。 """不加.strip()
file = open("少年游本意",mode="r",encoding="utf8") lineNumber = 0 for i in file:lineNumber+=1if lineNumber == 6:i = " ".join([i,"This is test Line.\n"])print(i,end="") """ 《少年游.本意》金庸 青衫磊落險峰行。 玉壁月華明。 馬疾香幽。 崖高人遠。 微步縠紋生。This is test Line. 誰家子弟誰家院。 無計悔多情。 虎嘯龍吟。 換巢鸞鳳。 劍氣碧煙橫。 """將文件轉成“枚舉”后打印行號
file = open("少年游本意",mode="r",encoding="utf8") for i,v in enumerate(file.readlines()):print(i,v,end="") """ 0 《少年游.本意》金庸 1 青衫磊落險峰行。 2 玉壁月華明。 3 馬疾香幽。 4 崖高人遠。 5 微步縠紋生。 6 誰家子弟誰家院。 7 無計悔多情。 8 虎嘯龍吟。 9 換巢鸞鳳。 10 劍氣碧煙橫。 """with 語句
為了避免打開文件后忘記關閉,可以通過with 管理上下下文
with 語句是**"上下文管理器“**定義的一個方法,用于打包一些需要執行的語句。這允許通用的” try…except…finally“ 一樣封裝一些便于重復使用的語句。
主要的使用方法如下:
with open("少年游本意",mode="r",encoding="utf8") as file:print(file.read())如上,當file文件使用完成后,會自動關閉該文件,釋放資源。
多個文件同時管理:
總結
以上是生活随笔為你收集整理的Python Basic - Python open() 、closed()、write()、read()、 readline()、readlines()、with与文件进行交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【P图神器】 人工智能魔术橡皮擦 jpg
- 下一篇: websocket python爬虫_p