我們在進行資料處理時,常常會需要讀取各式各樣的檔案,也會匯出特定的檔案,這一節我們針對文字檔(Text檔)的讀取與寫入進行說明。
10.1 文字檔的讀取與寫入
我們利用open()函數進行文字檔案的讀取與寫入,在程式的寫法中有兩種,以下簡單說明一下:
第一種:
f = open(檔案名稱,模式,編碼方式)
…檔案操作相關程式…
f.close()
第二種:
with open(檔案名稱,模式,編碼方式) as f:
…檔案操作相關程式…
第二種的寫法不需f.close(),程式執行完會自動關閉檔案。
open()函數終的模式有數種選擇,有只能讀取、只能寫入或同時可以讀取與寫入,我們將其整理成以下表格:
以下我們針對每一個模式的使用加以說明,在說明前,我們先在資料夾中建立兩個檔案,內容為中文字與英文字,如下圖所示,我們等等會讀取並寫入這兩個檔案。
程式碼
import os
os.getcwd()
os.chdir("D:/Bolg資料/Python/Python(10)")
#開啟文字檔並印出內容(1) [需要close()函數]
eng_article="eng-article.txt"
chinese_article="chinese-article.txt"
f2=open(chinese_article,"r",encoding="Big5")
print(f2,end="\n")
i=0
for row in f2:
print("Line{}:{}".format(i,row))
i+=1
f2.close()
Python畫面
程式碼
#開啟文字檔並印出內容(2) [不需要close()函數]
with open(eng_article,"r") as
f11:
j=0
for row in f11:
print("Line{}:{}".format(j,row))
j+=1
Python畫面
程式碼
#先寫入再讀取
with
open(chinese_article,"r+",encoding="Big5") as f3: #游標在第一列
f3.write("!寫入測試!") #會覆蓋原有的文字
Python畫面
程式碼
#寫入內容於文字檔(1) [mode=r+]
#先讀取再寫入
with
open(chinese_article,"r+",encoding="Big5") as f3:
k1=0;print("先讀取再寫入".center(20,"="))
for row1 in f3:
print("第{}列:{}".format(k1,row1))
k1+=1
f3.write('!寫入測試!') #游標已在最後一列
Python畫面
for 迴圈每執行一次即讀取一次,讀取時游標會跟著移動,所以當整份文件讀取完後,游標就會停在內容的尾端,此時寫入內容時,就會接在原內容的尾端。我們也可以用seek函數去移動游標位置,以下說明一下seek()函數的使用方式。
f.seek(偏移位置,游標位置)
游標位置為
0表示游標在內容的最前端。(預設)
1表示游標在目前位置。
2表示游標在內容的最尾端。
偏移位置表示從游標位置算起,相對的偏移位置。(預設為0)
我們也可以利用tell()函數知道目前游標所在的位置,在內容的最前端位置為0。
程式碼
with
open(chinese_article,"r+",encoding="Big5") as f3:
f3.seek(0,2) #游標已在最後一列
f3.write('!寫入測試!')
Python畫面
程式碼
#寫入內容於文字檔(2) [mode=w]
String='''你好,我叫Shawn,目前任職於XX科技品管部門!'''
with open("Mode_w-test.txt","w",encoding="Big5")
as f4:
f4.write(String)
#print(f4.read()) #不可讀取,產生Error。
Python畫面
程式碼
#寫入內容於文字檔(3) [mode=w+]
String='''Hello,我叫Shawnh,目前任職於XX科技品管部門!'''
with
open("Mode_w-test.txt","w+",encoding="Big5") as
f5:
f5.write(String)
f5.seek(0) #將游標移至標頭
String2 = f5.read() #可讀取
print("讀取的內容為:"+String2)
Python畫面
程式碼
#r與w的應用(更新第一列的內容)
with
open(chinese_article,"r",encoding="Big5") as f6: #游標在第一列
print("更新前的內容:\n" + f6.read())
f6.seek(0)
content=f6.readlines()
with
open(chinese_article,"w+",encoding="Big5") as f6: #游標在第一列
content[0]="!更新列!\n"
f6.writelines(content)
f6.seek(0)
print("更新後的內容:\n" + f6.read())
Python畫面
在r與w的應用中,我們用到了readlines()函數,此函數可以內容轉換成一個陣列,陣列中的元素為內容中的每一列,透過陣列的相關操作,將修改好的陣列在寫入文件(利用writelines()函數)中,達到文件更新的效果。
程式碼
#寫入內容於文字檔(4) [mode=a]
with
open("Mode_w-test.txt",mode="a",encoding="Big5")
as f7:
f7.write("!寫入測試!")
f7.read() #不可讀取,產生Error。
Python畫面
程式碼
#寫入內容於文字檔(5) [mode=a+]
with
open("Mode_w-test.txt",mode="a+",encoding="Big5")
as f8:
f8.write("\n!寫入測試!") #換行寫入
f8.seek(0)
print(f8.read()) #可讀取。
Python畫面
10.2 二進位檔案的讀寫
如果檔案的副檔名為.bin,就是二進位檔案,內容全是二進位編碼,我們要如何開啟並解譯其內容,我們以下進行說明:
我們首先先利用open函數創造出一個二進位檔案,再說明如何讀取二進位檔案。
程式碼
#寫入二進位檔案
String='''你好,我叫Shawn,目前任職於XX科技品管部門!\n請大家多多指教...'''
with
open("Mode_wb+-test.bin",mode="wb+") as f10:
f10.write(String.encode("Big5"))
#先進行二進位編碼(encode)再寫入
f10.seek(0)
print("二進位內容:"+ str(f10.read()))
f10.seek(0)
print("解碼後內容:"+ f10.read().decode("Big5")) #將二進位內容進行解碼(decode)
Python畫面
要創造一個二進位檔案,其實就是用寫入模式,但是因為要建立二進位檔案,在模式上面我們會寫成wb或wb+,如果是要讀取就要寫成rb或rb+,這就是要特別注意的地方。這裡我們會發現,直接時使用read()函數呈現出來的結果會是一串二進位編碼,這是因為檔案本身位二進位檔案的緣故。若要解譯其內容就是要使用decode(編碼模式)函數進行解譯,我們這邊因為內容為中文,所以我們使用Big5的編碼模式進行解譯。
程式碼
#讀取二進位檔案
with
open("Mode_wb+-test.bin", mode="rb") as f11:
print(f11.read().decode("Big5"))
Python畫面
留言
張貼留言