Python文件操作

前言

我們寫的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操作文件也是類似的三步:

  1. 打開文件
  2. 操作文件
  3. 關(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曹步,一起剝皮案震驚了整個濱河市宪彩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讲婚,老刑警劉巖尿孔,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磺樱,居然都是意外死亡纳猫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門竹捉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尚骄,你說我怎么就攤上這事块差。” “怎么了倔丈?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵憨闰,是天一觀的道長。 經(jīng)常有香客問我需五,道長鹉动,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任宏邮,我火速辦了婚禮泽示,結(jié)果婚禮上缸血,老公的妹妹穿的比我還像新娘。我一直安慰自己械筛,他們只是感情好捎泻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埋哟,像睡著了一般笆豁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赤赊,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天闯狱,我揣著相機(jī)與錄音,去河邊找鬼抛计。 笑死扩氢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爷辱。 我是一名探鬼主播录豺,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饭弓!你這毒婦竟也來了双饥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弟断,失蹤者是張志新(化名)和其女友劉穎咏花,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阀趴,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昏翰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刘急。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚菊。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叔汁,靈堂內(nèi)的尸體忽然破棺而出统求,到底是詐尸還是另有隱情,我是刑警寧澤据块,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布码邻,位于F島的核電站,受9級特大地震影響另假,放射性物質(zhì)發(fā)生泄漏像屋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一边篮、第九天 我趴在偏房一處隱蔽的房頂上張望己莺。 院中可真熱鬧奏甫,春花似錦、人聲如沸篇恒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胁艰。三九已至款筑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腾么,已是汗流浹背奈梳。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留解虱,地道東北人攘须。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像殴泰,于是被迫代替她去往敵國和親于宙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容