在學習使用open函數打開文件並對其進行操作時,我們需要了解打開文件並且對文件進行操作的過程是怎么樣的,還需要了解打開文件的常見模式,以及對文件句柄操作的的常用方法等等。其中難點是屢清楚文件的編碼問題。
文件處理的流程:
1、打開文件,得到文件句柄並將其賦值給一個變量
2、通過文件句柄對文件進行操作(其實文件句柄本身是一個迭代器對象。)
3、關閉文件(即釋放操作系統分配的內存空間)
#1、以只讀模式打開文件,獲得文件句柄並賦值給f變量
f =open("test.txt","r",encoding="utf-8") #2、讀取文件
print(f.read()) #3、關閉文件
f.close()
從上述示例中,“r”->只讀模式打開文件,那我們接下來看一下文件打開有哪些模式:
文件模式
1、打開文件的模式有:
|
2、打開非文本文件時,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
|
3、"+" 表示可以同時讀寫某個文件
|
在了解打開文件的各種打開模式時,我們需要對文件的編碼有一定的了解。
文件的字符編碼
在了解文件編碼時我們需了解一下幾個點:
1、由於文件在硬盤中是以字節的方式存儲的,而故在打開文本文件時需要需要指定文件的編碼encoding="編碼類型",寫入文件也時需要指定譯碼格式,encoding="編碼類型。"
2、文件以什么編碼類型寫入,必須以什么編碼讀取。即若文件若以“utf-8”的編碼類型寫入,就必須以“utf-8”的編碼類型讀取,否則會發生亂碼。
3、一個文本文件內,只允許有一種編碼類型,否則也會發生亂碼。
4、字符串數據類型轉為字節格式:encode(),字節格式轉為字符串數據類型:decode()。
注:b模式,無需指定編碼類型,因為其本身就是直接從內存中讀取字節格式,而若想將讀取的字節編碼以字符串類型顯示則需要譯碼成指定格式,即decode()。
#創建新文件buffer,指定編碼格式為utf-8 f1=open("buffer.txt","w",encoding="utf-8") f1.write("hello world.") f1.write("你好世界") f1.close() #打開該文件,若以其他編碼格式打開則會出現亂碼 f2=open("buffer.txt","r",encoding="gbk") print(f2.read()) f2.close() #輸出為:hello world.浣犲ソ涓栫晫
實例:
r模式-->只讀模式,讀取的文件必須是事先存在的,否則報錯

1 #r-->只讀模式 2 f =open("buffer.txt","r",encoding="utf-8") 3 # print(f.read()) #read->讀取文件內容,讀取完文件句柄停留在最后 4 # print(f.readline(),end="") #逐行讀取,讀完后文件句柄停留在下一行的行首 5 # print(f.readline()) 6 print(f.readlines()) #逐行讀取,並且將每行添加至空列表中,並返回列表 7 f.close()
w模式-->只寫模式,文件存在則覆蓋式寫入,文件不存在則創建新文件

1 # w->只寫模式 2 fw =open("buffer.txt","w",encoding="utf-8") 3 fw.write("取代-->原內容]\n") #寫入,並且覆蓋 4 fw.writelines(["hello world.\n","你好,世界。"]) #以列表的方式逐行寫入 5 fw.close()
a模式->追加模式,文件存在則追加式寫入,文件不存在則創建新文件

#a->追加模式 fa=open("buffer.txt","a",encoding="utf-8") fa.write("\n這是追加模式,並非覆蓋") fa.close()
r+模式->讀寫模式,可讀可寫,寫入是以追加的方式寫入

#r+->讀寫模式,必須先讀后寫 fr1=open("buffer.txt","r+",encoding="utf-8") print(fr1.read()) fr1.write("\nMy name is little-five,I'm 22 years old.") #追加的方式寫入 fr1.close() #w+->寫讀模式,先清空再寫入 fr2=open("buffer.txt","w+",encoding="utf-8") print(fr2.read()) fr2.write("\nMy name is little-five,I'm 22 years old.") fr2.close()
b模式

#rb模式 #由於文件的在硬盤中的存儲就是以二進制的方式存取的,而b模式本身就是指定以二進制的字節方式讀取, 故不需要指定以何種編碼方式讀取 f =open("test.txt","rb") data =f.read() print(data.decode("utf-8")) #讀取出來是字節,故decode轉換為字符串格式 f.close() #wb模式 #同理,寫入也必須以字節的方式寫入。 f= open("test.txt","wb") #轉換為字節格式的兩種方式: #①bytes內置函數 f.write(bytes(b"hello,this world.\n")) f.write(bytes("你好,中國\n",encoding="utf-8")) #②encode()方法 f.write("你好,世界。".encode("utf-8")) #由於python默認以utf-8的編碼方式編碼的,故若以其他的編碼方式寫入,則該文件內會出現亂碼 # f.write("哈哈哈,真優秀。".encode("gbk")) f.close()
文件的其他操作方法:
#①、tell()-->查看文件句柄所在位置,以字節為單位。即對於中文以utf-8編碼,處理為3個字節。
f1 = open("a.txt","r",encoding="utf-8",newline="") # print(f1.readlines()) #文件讀取一行,光標移動到下一行的最前面
print(f1.readline()) print(f1.tell()) #中文為三個字節,同時加上\r\n
f1.close() #②seek(int)-->移動文件句柄即光標的位置,也是以字節為單位。
f2 = open("a.txt","r+",encoding="UTF-8") f2.seek(8) #將文件句柄移至字節為8的位置
f2.write("你好") print(f2.tell()) #獲取文件句柄位置
f2.close() #③#truncate(int)-->本質為寫操作,必須在r+或者a+模式下進行,截取文件內容
f3 = open("a.txt","r+",encoding="UTF-8") f3.truncate(8) # f3.truncate(10) #截取,使用字節為單位截取的,而一個中文在utf-8中用三個字節表示,若截取的字節在一個中文所表示的字節內,則會發生亂碼的現象
f3.close() #④flush()->刷新,即操作文件時,是將文件加載到內存中進行操作的,而對文件進行操作時,通過flush可以將數據加載回硬盤中。
f4=open("test.txt","r+",encoding="utf-8") f4.write("\nthis is end line") f4.flush() f4.close()
不寫了,寫多了亂。重點其實也沒這么多。了解原理了其實很簡單去實現這些功能。