1. 程式人生 > >檔案處理簡介與只讀、只寫、只追加三種開啟模式

檔案處理簡介與只讀、只寫、只追加三種開啟模式

檔案處理的基本操作:
1.開啟檔案得到檔案控制代碼並賦值給一個變數。( 變數=open(“檔名”,“模式”, encoding="解碼方式”) 操作即為得到檔案控制代碼並賦值給變數的過程。)
2.通過檔案控制代碼對檔案進行操作。( 變數.操作() )
3.關閉檔案。( f.close() 語句)

其中,如果被開啟檔案在當前操作檔案的同一硬碟檔案位置則可以只輸入相對路徑,如果不在同一硬碟檔案路徑則必須輸入絕對路徑。

open語句相當於從作業系統要了一種操作方式,以這種方式對硬碟上的資料進行操作。

open語句預設會以檢測到的系統編碼為檔案解碼方式,而Windows為gbk編碼。

開啟模式分為只讀模式(“r”),只寫模式(“w”),只追加模式(“a”),此外還有r+、w+、a+的讀寫模式。

硬碟中儲存檔案的檔案資料是不可修改的,檔案的修改是通過讀入記憶體中,在記憶體中儲存的檔案內容是可以修改的,在記憶體中修改後覆蓋原始檔案。

不論是隻讀還是隻寫或是隻追加,他們的encoding引數代表的是從硬碟讀出時或者往硬碟寫入時的資料型別,再讀入記憶體後資料均為unicode編碼

軟體實現文字內容修改的機制:將原始檔案讀入記憶體中,在記憶體中將修改完成後生成新檔案,讓新檔案去覆蓋舊檔案。


只讀模式
在只讀模式下,只可以把硬碟上的檔案以指定的編碼方式讀入記憶體。
注意讀取會按照游標位置讀取,在.read()語句讀取完整個檔案後游標已經移到了檔案內容的末尾,此時再掉用.readline()語句則不會讀取到任何內容。
.read()語句


表示讀取整個檔案內容

#有以Test1命名的以UTF-8編碼儲存在硬碟同一位置的txt檔案
f = open("Test1", "r", encoding="utf8")
data = f.read()
print(data)
f.close()

.readable()語句
是否可讀,當為寫模式開啟時,返回為False。

#有以Test1命名的以UTF-8編碼儲存在硬碟同一位置的txt檔案
f = open("Test1", "r", encoding="utf8")
print(f.readable())
f.close()

.readline()語句
一行一行讀取資料

#有以Test1命名的以UTF-8編碼儲存在硬碟同一位置的txt檔案
f = open("Test1", "r", encoding="utf8")
data1 = f.readline()
data2 = f.readline()
print(data1, data2, sep="")
f.close()

.readlines()語句
多行讀取,返回的是一個列表

#有以Test1命名的以UTF-8編碼儲存在硬碟同一位置的txt檔案
f = open("Test1", "r", encoding="utf8")
print(f.readlines())
f.close()

只寫模式
在只寫模式下,只可以把記憶體中的資料以指定的編碼方式寫入硬碟。
只寫操作在開啟已存在的檔案時會將該檔案清空再操作,在開啟不存在的檔案時將會在指定位置建立一個檔案並命名為,即建立新檔案覆蓋原檔案。
所有寫操作寫入檔案的都是字串。
.write()語句
表示在游標位置寫入內容。

#在同一目錄下
f = open("Test2", "w", encoding="utf8")
f.write("1111\n22222\n33333\n44444\n55555\n66666")
f.close()

.writable()語句
是否可寫,在只讀模式下返回False。

#在同一目錄下
f = open("Test2", "w", encoding="utf8")
print(f.writable())
f.close()

.writelines()語句
傳入的為一個列表

#在同一目錄下
f = open("Test2", "w", encoding="utf8")
f.writelines(["1111\n", "22222\n", "33333\n", "44444\n", "55555\n""66666"])
f.close()

只追加模式
檔案追加會將所有追加的內容寫在原檔案內容的末尾。
如果追加的檔案不存在會在指定位置建立一個指定名字的檔案。
本質上就是一種寫模式

#有以Test1命名的以UTF-8編碼儲存在硬碟同一位置的txt檔案
f = open("Test1", "a", encoding="utf8")
f.write("追加在檔案末尾")
f.close()

讀寫模式
在游標位置讀取,也在標位置寫入。
所以讀寫模式不會將文字整個覆蓋掉,而只覆蓋游標位置的文字。

#有以Test1命名的以UTF-8編碼儲存在硬碟同一位置的txt檔案
f = open("Test1", "r+", encoding="utf8")
f.read()
f.write("經過.read()語句游標在末尾,所以此處插入在檔案末尾位置")
f.close()

如果不將游標移動到檔案末尾後再寫入檔案,會覆蓋掉原始檔案的內容

#當前目錄下有Test1檔案且檔案的第一行有內容
f = opwen("Test1", "r+", encoding= "utf8")
f.write("Hello")
f.close()

模擬記憶體讀入資料後寫至硬碟的操作
注意Pycharm檢視檔案時預設的開啟編碼是utf8編碼,再開啟gbk編碼的檔案時需要手動設定。

#將當前位置以utf8編碼編寫的Test1內容讀入記憶體後以gbk編碼寫入當前目錄下的Test3檔案
src_f = open("Test1", "r", encoding = "utf8")
data = src_f.read()
src_f.close()

dst_f = open("Test3", "w", encoding= "gbk")
dst_f.write(data)
dst_f.close()

在讀出檔案後對檔案進行修改再寫入另一個檔案的情況:
利用 .readlines()語句 和 .writelines()語句 或者 .write() 語句配合。

#讀取當前位置以utf8編碼的檔案Test1,將該檔案的第一行寫入當前目錄下以gbk編碼的檔案Test4
sec_f = open("Test1", "r", encoding="utf8")
data = sec_f.readlines()  # 此處data為一個列表
sec_f.close()

dst_f = open("Test4", "w", encoding="gbk")
dst_f.write(data[0])  # 注意此處data雖然是列表形式但data[0]為字串,所以採用 .write()語句 而不是 .writelines()語句。
dst_f.close()

with as 用法
以with關鍵字執行檔案操作時不需要在末尾加入close語句。

#對當前目錄下的以utf8編碼的Test1檔案執行操作
with open("Test1", "a", encoding="utf8") as f:
    f.write("\nwith關鍵字的測試")

以with關鍵字完成模擬記憶體讀入資料後寫至硬碟的操作:

#將當前位置以utf8編碼編寫的Test1內容讀入記憶體後只將Test1內容的第二行以gbk編碼寫入當前目錄下的Test4檔案
with open("Test1", "r", encoding="utf8") as src_f, \
		open("Test4", "w", encoding="gbk") as dst_f:
	data = src_f.readlines()
	dst_f.write(data[1])