open函數之文件處理


  

  在學習使用open函數打開文件並對其進行操作時,我們需要了解打開文件並且對文件進行操作的過程是怎么樣的,還需要了解打開文件的常見模式,以及對文件句柄操作的的常用方法等等。其中難點是屢清楚文件的編碼問題。

  文件處理的流程:

    1、打開文件,得到文件句柄並將其賦值給一個變量

    2、通過文件句柄對文件進行操作(其實文件句柄本身是一個迭代器對象。)

    3、關閉文件(即釋放操作系統分配的內存空間)

#1、以只讀模式打開文件,獲得文件句柄並賦值給f變量
f =open("test.txt","r",encoding="utf-8") #2、讀取文件
print(f.read()) #3、關閉文件
f.close()

  從上述示例中,“r”->只讀模式打開文件,那我們接下來看一下文件打開有哪些模式:

  文件模式

1、打開文件的模式有

  • r-->只讀模式。默認模式,文件必須存在,不存在則拋出異常。
  • w-->只寫模式。不可讀,文件存在則刪除文件內容,不存在則創建。
  • a-->追加模式。可讀,文件存在則追加在文件末尾,不存在則創建。

 2、打開非文本文件時,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)

  • rb-->以字節的方式讀取文件
  • wb-->以字節的方式寫入文件
  • ab-->以字節的方式追加入文件
 3、"+" 表示可以同時讀寫某個文件
  • r+,可讀寫文件。【可讀;可寫;可追加】
  • w+,寫讀
  • a+,同a

   在了解打開文件的各種打開模式時,我們需要對文件的編碼有一定的了解。

 

  文件的字符編碼

    在了解文件編碼時我們需了解一下幾個點:

    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()
r模式

  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()
r模式

  a模式->追加模式,文件存在則追加式寫入,文件不存在則創建新文件

#a->追加模式
fa=open("buffer.txt","a",encoding="utf-8")
fa.write("\n這是追加模式,並非覆蓋")
fa.close()
a模式

  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()
r+ w+

  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()
b模式

  文件的其他操作方法:

#①、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()

  不寫了,寫多了亂。重點其實也沒這么多。了解原理了其實很簡單去實現這些功能。

 

 

    

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM