前言
我們寫的Python程序笼平,如爬蟲程序,在運(yùn)行時會產(chǎn)生很多數(shù)據(jù)舔痪。這些數(shù)據(jù)都保存在內(nèi)存當(dāng)中寓调,如果程序運(yùn)行結(jié)束,或者電腦關(guān)機(jī)锄码,數(shù)據(jù)便丟失了夺英,我們無法再繼續(xù)使用這些數(shù)據(jù)。那么滋捶,我們該怎么保存這些數(shù)據(jù)呢痛悯?
我們可以通過將數(shù)據(jù)保存到文件或者數(shù)據(jù)庫,來實(shí)現(xiàn)數(shù)據(jù)的保存炬太,今天就來說一下如何將數(shù)據(jù)保存到文件灸蟆。
Python操作文件的方式很像我們在電腦的記事本上記錄文字:在文件夾中新建一個readme.txt
文件,使用記事本打開亲族,在記事本中寫下文字炒考,然后保存、關(guān)閉霎迫。
Python操作文件也是類似的三步:
- 打開文件
- 操作文件
- 關(guān)閉文件
打開文件
Python使用內(nèi)置的open()
方法打開文件斋枢,用于對文件執(zhí)行讀寫操作,open()
方法返回值是一個file對象知给。
基本語法格式:f = open(filename, mode)
-
filename:要訪問文件的路徑瓤帚,字符串形式描姚。如文件是上一級目錄的
readme.txt
,則filename即為../readme.txt
戈次,關(guān)于文件路徑轩勘,詳見文件路徑。 -
mode:打開文件的模式怯邪,默認(rèn)為
r
绊寻,即只讀模式。- r:只讀悬秉,默認(rèn)模式澄步,如果文件不存在就報(bào)錯,存在就正常讀取和泌。
- w:只寫村缸,如果文件不存在,新建文件然后寫入武氓;如果存在梯皿,清空文件內(nèi)容,再寫入聋丝。
- a:追加索烹,如果文件不存在工碾,新建文件后寫入弱睦;如果存在,在文件最后追加寫入渊额。
- x:新建况木,如果文件存在則報(bào)錯,如果文件不存在就新建文件旬迹,然后寫入火惊。
- b:二進(jìn)制模式,使用rb奔垦、wb屹耐、ab,以 bytes 類型操作數(shù)據(jù)椿猎。
- +:讀寫模式惶岭,使用r+(常用)、w+犯眠、a+按灶。
有時候我們還需要注意文件的編碼,由于Python3的默認(rèn)編碼為UTF-8筐咧,如果要讀取非UTF-8編碼的文件鸯旁,需要給open()
函數(shù)傳入encoding
參數(shù)噪矛,下面以讀取GBK編碼的文件為例:
f = open('readme.txt', 'r', encoding='gbk')
操作文件
讀取
Python的有4中方法讀取文件,我們應(yīng)根據(jù)情況铺罢,選用合適的讀取方法:
- 如果文件很小艇挨,使用
read()
一次性讀取韭赘; - 如果不能確定文件大小雷袋,可以使用
read(size)
指定每次讀的大小,多次讀取文件辞居; - 如果是一行一行的文件楷怒,可以使用
readlines()
或readline()
來讀取文件; - 一般情況下瓦灶,可以使用for遍歷來讀取文件鸠删,這樣速度最快。
f.read(size)
讀取文件中一定大小的數(shù)據(jù)贼陶,然后作為字符串或字節(jié)對象返回刃泡。size
是一個可選的數(shù)字類型的參數(shù),用于指定讀取的數(shù)據(jù)量碉怔,單位為字節(jié)烘贴。如果size
參數(shù)被忽略或?yàn)樨?fù)值,則會讀取整個文件內(nèi)容并返回撮胧。
with open('readme.txt', 'r') as f:
str = f.read()
print(str)
f.readline()
從文件中讀取一行內(nèi)容桨踪,可以多次調(diào)用以讀取多行,如果返回一個空字符串芹啥,說明讀到了最后一行锻离。
with open('readme.txt', 'r') as f:
str = f.readline()
print(str)
f.readlines()
將文件中的所有行讀取后按順序放入一個列表中,返回這個列表墓怀。
with open('readme.txt', 'r') as f:
lis = f.readlines()
print(lis)
for遍歷
可以將文件對象作為一個迭代器來使用:
with open('readme.txt', 'r') as f:
for line in f:
print(line, end='')
寫入
f.write()
要想往文件中寫入數(shù)據(jù)汽纠,需要使用w
或者a
模式打開文件。Python中的write()
方法用于將字符串或者bytes類型的數(shù)據(jù)寫入文件內(nèi)傀履。
f = open('readme.txt', 'w')
f.write('Hello, world!')
f.close()
write()
可以執(zhí)行多次虱朵,但是寫操作都是在內(nèi)存中,不會立刻寫入硬盤钓账,只有調(diào)用close()
方法后碴犬,才會將所有的寫入操作反映到磁盤上。如果想立刻保存到硬盤上官扣,可以使用f.flush()
方法翅敌,但這可能造成數(shù)據(jù)不一致。
關(guān)閉文件
Python使用close()
方法關(guān)閉文件對象惕蹄,當(dāng)處理完一個文件后蚯涮,我們可以使用f.close()
來關(guān)閉文件治专,釋放系統(tǒng)的資源。
f.close()
如果忘記關(guān)閉文件遭顶,可能造成數(shù)據(jù)只寫了一部分到磁盤张峰,剩下的數(shù)據(jù)丟失了,或者導(dǎo)致更糟糕的結(jié)果棒旗。
with關(guān)鍵字
盡管我們需要記得在完成文件處理后關(guān)閉文件喘批,但常常還是會忘記,以至于造成數(shù)據(jù)的丟失铣揉。使用with
關(guān)鍵字可以有效的避免這種情況的發(fā)生饶深。
使用with
關(guān)鍵字,可以保證在我們處理完文件后文件正常關(guān)閉逛拱,不需要再另外使用close()
方法取關(guān)閉文件啦敌厘!
既然with
這么好用,那么該如何使用呢朽合?
以打開一個readme.txt
文件俱两,并在其中寫入“Hello, world!”為例,我們可以用如下的方法:
with open('readme.txt', 'w') as f:
f.write('Hello, world!')
當(dāng)需要同時打開多個文件時:
with open('readme.txt') as f1, open('readme.md') as f2:
s1 = f1.read()
s2 = f2.read()