數(shù)據(jù)的存儲可以使用數(shù)據(jù)庫,也可以使用文件。數(shù)據(jù)庫保持了數(shù)據(jù)的完整性和關(guān)聯(lián)性,而且使數(shù)據(jù)更安全、可靠。使用文件存儲數(shù)據(jù)則非常簡單、易用,不必安裝數(shù)據(jù)庫管理系統(tǒng)等運行環(huán)境。文件通常用于存儲應用軟件的參數(shù)或臨時性數(shù)據(jù)。Python的文件操作和Java的文件操作十分相似,Python提供了os、os.path等模塊處理文件。
文件的常見操作
文件通常用于存儲數(shù)據(jù)或應用系統(tǒng)的參數(shù)。Python提供了os、os.path、shutil等模塊處理文件,其中包括打開文件、讀寫文件、復制和刪除文件等函數(shù)。
Python3中移除了全局的file()函數(shù),還保留了open()函數(shù)。文件的打開或創(chuàng)建可以使用函數(shù)open()。該函數(shù)可以指定處理模式,設置打開的文件為只讀、只寫或可讀寫狀態(tài)。open()的聲明如下所示。
open(file, mode='r', buffering=-1, encoding=None,
errors=None, newline=None, closefd=True, opener=None) -> file object
【代碼說明】
參數(shù)file是被打開的文件名稱。如果文件file不存在,open()將創(chuàng)建名為name的文件,然后再打開該文件。
參數(shù)mode是指文件的打開模式。文件的打開模式如表7-1所示。
參數(shù)buffering設置緩存模式。0表示不緩存;1表示行緩沖;如果大于1則表示緩沖區(qū)的大小,以字節(jié)為單位。
open()返回1個file對象,file對象可以對文件進行各種操作。
注意 對于圖片、視頻等文件必須使用“b”的模式讀寫。
file類用于文件管理,可以對文件進行創(chuàng)建、打開、讀寫、關(guān)閉等操作。file類的常用屬性和方法如下表:
文件的處理一般分為以下3個步驟:
1)創(chuàng)建并打開文件,使用file()函數(shù)返回1個file對象。
2)調(diào)用file對象的read()、write()等方法處理文件。
3)調(diào)用close()關(guān)閉文件,釋放file對象占用的資源。
注意 close()方法是必要的。雖然Python提供了垃圾回收機制,清理不再使用的對象,但是手動釋放不再需要的資源是一種良好的習慣。同時也顯式地告訴Python的垃圾回收器:該對象需要被清除。
下面這段代碼演示了文件的創(chuàng)建、寫入和關(guān)閉操作。
# 創(chuàng)建文件
context = '''hello world'''
file = open('hello.txt', 'w') # 打開文件
file.write(context) # 把字符串寫入文件
file.close() # 關(guān)閉文件
【代碼說明】
第3行代碼調(diào)用open()創(chuàng)建文件hello.txt,設置文件的訪問模式為“w”。open()返回文件對象f。
第4行代碼把變量context的值寫入文件hello.txt。
第5行代碼調(diào)用對象f的close()方法,釋放對象f占用的資源。
文件的讀取有多種方法,可以使用readline()、readlines()或read()函數(shù)讀取文件。下面將一一介紹這些函數(shù)讀取文件的實現(xiàn)方法。
1.按行讀取方式readline()
readline()每次讀取文件中的一行,需要使用永真表達式循環(huán)讀取文件。但當文件指針移動到文件的末尾時,依然使用readline()讀取文件將出現(xiàn)錯誤。因此程序中需要添加1個判斷語句,判斷文件指針是否移動到文件的尾部,并且通過該語句中斷循環(huán)。
下面這段代碼演示了readline()的使用。
編輯測試文件為:
# cat hello.txt
hello world
hello China
# 使用readline()讀文件
f = open('hello.txt')
while True:
line0 = f.readline(2)
if line0:
print(line0)
else:
break
f.close()
print('---------------------------')
print('由于hello.txt剛才被打開讀取完成,所以這里需要重新打開文件,重頭讀取文件。')
print('---------------------------')
f = open('hello.txt')
while True:
line1 = f.readline()
if line1:
print(line1)
else:
break
f.close()
【代碼說明】
第3行代碼使用了“Ture”作為循環(huán)條件,構(gòu)成1個永真循環(huán)。
第4行代碼并不表示每行只讀取2個字節(jié)的內(nèi)容,而是指每行每次讀2個字節(jié),直到行的末尾。
第18行代碼調(diào)用readline(),讀取hello.txt文件的每一行。
第19行代碼,判斷變量line是否為真。如果為真,則輸出當前行的內(nèi)容;否則,退出循環(huán)。
2.多行讀取方式readlines()
使用readlines()讀取文件,需要通過循環(huán)訪問readlines()返回列表中的元素。
函數(shù)readlines()可一次性讀取文件中多行數(shù)據(jù)。
下面這段代碼演示了readlines()讀取文件的方法:
# 使用readlines()讀文件
f = open('hello.txt')
lines = f.readlines()
for line in lines:
print(line)
f.close()
【代碼說明】
第3行代碼調(diào)用readlines(),把文件hello.txt中所有的內(nèi)容存儲在列表lines中。
第4行代碼循環(huán)讀取列表lines中的內(nèi)容。
第5行代碼輸出列表lines每個元素的內(nèi)容,即文件hello.txt每行的內(nèi)容。
第6行代碼手動關(guān)閉文件。
3.一次性讀取方式read()
讀取文件最簡單的方法是使用read(),read()將從文件中一次性讀出所有內(nèi)容,并賦值給1個字符串變量。
下面這段代碼演示了read()讀取文件的方法:
# 使用read()讀文件
f = open('hello.txt')
context = f.read()
print(context)
f.close()
【代碼說明】
第3行代碼調(diào)用read(),把文件hello.txt中所有的內(nèi)容存儲在變量context中。
第4行代碼輸出所有文件內(nèi)容。
可以通過控制read()參數(shù)的值,返回指定字節(jié)的內(nèi)容。
f = open('hello.txt')
context = f.read(5) # 讀取文件前5個字節(jié)的內(nèi)容
print(context)
print(f.tell()) # 返回文件對象當前指針位置
context = f.read(5) # 繼續(xù)讀取5個字節(jié)內(nèi)容
print(context)
print(f.tell())
f.close()
【代碼說明】
第2行代碼調(diào)用read(5),讀取hello.txt文件中前5個字節(jié)的內(nèi)容,并存儲到變量context中。此時文件的指針移到第5個字節(jié)處。
第3行代碼輸出變量context的結(jié)果,輸出的結(jié)果為“hello”。
第4行代碼調(diào)用tell(),輸出當前文件指針的位置:5。
第5行代碼再次調(diào)用read(5),讀取第6個字節(jié)到第10個字節(jié)的內(nèi)容。
第6行代碼輸出結(jié)果為“worl”。
第7行代碼輸出當前文件指針的位置:10。
注意 file對象內(nèi)部將記錄文件指針的位置,以便下次操作。只要file對象沒有執(zhí)行close()方法,文件指針就不會釋放。