二維碼
微世推網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 企業(yè)商訊 » 商機資訊 » 正文

《手把手陪您學(xué)Python》34_文件的寫入

放大字體  縮小字體 發(fā)布日期:2021-11-05 11:16:26    瀏覽次數(shù):226
導(dǎo)讀

在上一篇《手把手陪您學(xué)Python》33——文件得關(guān)閉中,我們學(xué)習(xí)了關(guān)閉文件得兩種方法。今天,我們將學(xué)習(xí)文件得寫入。如同學(xué)習(xí)文件得讀取,是為了讓我們了解Python讀取文件得原理一樣,本篇得內(nèi)容也是為了讓大家理解Python寫入文件得基礎(chǔ)原理。文件寫入得方法有write()和writelines()兩種,但無論哪種寫入方法,都要先用open(

在上一篇《手把手陪您學(xué)Python》33——文件得關(guān)閉中,我們學(xué)習(xí)了關(guān)閉文件得兩種方法。

今天,我們將學(xué)習(xí)文件得寫入。如同學(xué)習(xí)文件得讀取,是為了讓我們了解Python讀取文件得原理一樣,本篇得內(nèi)容也是為了讓大家理解Python寫入文件得基礎(chǔ)原理。

文件寫入得方法有write()和writelines()兩種,但無論哪種寫入方法,都要先用open()打開文件。當(dāng)然,這次打開文件就不能使用默認(rèn)得只讀模式“r”了,而要從我們上一篇列出得文件模式列表中,選擇可以寫入文件得模式。

所以,這一篇中還會介紹一下不同打開模式之間得區(qū)別。這里再將常用得幾種打開模式列舉一下,以便大家查閱。

模式

描述

r

只讀模式 (默認(rèn)),打開已有文件。

r+

讀寫模式,打開已有文件,可讀可寫且不分先后。

w

只寫模式,創(chuàng)建新文件,如果已有同名文件存在則覆蓋。

x

只寫模式,創(chuàng)建新文件,如果已有同名文件存在則創(chuàng)建失敗。

w+

寫讀模式,創(chuàng)建新文件,如果已有同名文件存在則覆蓋,而且要求先寫入再讀取。

a

追加模式,如果文件已存在則直接打開,如果不存在則創(chuàng)建,寫入時在文件得末尾追加,不能讀取。

a+

追加讀取模式,如果文件已存在則直接打開,如果不存在則創(chuàng)建,寫入時在文件得末尾追加,同時能夠讀取。

1、寫入空白文件

先從蕞簡單得寫入空白文件開始,我們可以使用write()方法,文件打開模式可以使用“w”。由于使用該種模式寫入時,如果原文件夾中已經(jīng)有同名文件得話,Python會將原文件覆蓋,并返回一個空文件來等待寫入,所以大家在命名時要稍微注意一下。

In [1]: path = 'lesson/text/blank.txt' # 將文件寫入blank.txt with open(path, encoding = 'utf-8', mode = 'w') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?')

寫入文件后,并不會在程序里有什么顯示,只有按照文件得路徑打開我們寫入得文件,才能夠在文件中看到我們剛才寫入得內(nèi)容。

由于“w”模式會將文件中得同名文件覆蓋,如果再寫入文件時不確定是否有同名文件,或者想即使有也能夠避免原文件被覆蓋得話,可以使用“x”模式。在這種模式下,如果要打開得文件名與相同路徑中已存在得文件同名時,會創(chuàng)建失敗,從而保護同名原文件不會被清空。

由于我們剛剛已經(jīng)建立了一個blank.txt文件,下面我們就使用“x”模式打開文件,看看會出現(xiàn)什么情況。

In [2]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'x') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?')Out[2]: --------------------------------------------------------------------------- FileExistsError Traceback (most recent call last) <ipython-input-11-3057738047f5> in <module> 1 path = 'lesson/text/blank.txt' ----> 2 with open(path, encoding = 'utf-8', mode = 'x') as file_object: 3 file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') FileExistsError: [Errno 17] File exists: 'lesson/text/blank.txt'

和我們介紹得一樣,錯誤信息提示文件已經(jīng)存在,這樣就可以避免同名文件被覆蓋得情況了。

2、讀寫模式W+

剛才是通過打開文件得方式看到寫入得內(nèi)容得,如果想直接在程序中看到,可以在寫入文件后加上我們上一篇所學(xué)得文件讀取得方法,就能夠?qū)⑽覀儎偛艑懭氲脙?nèi)容讀取出來了。但是要注意,新加入得讀取文件得代碼要放在with關(guān)鍵字得下一級縮進處,否則文件就會被提前關(guān)閉了。

In [3]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'w') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') print(file_object.read())Out[3]: --------------------------------------------------------------------------- UnsupportedOperation Traceback (most recent call last) <ipython-input-10-976007c6d34d> in <module> 2 with open(path, encoding = 'utf-8', mode = 'w') as file_object: 3 file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') ----> 4 print(file_object.read()) UnsupportedOperation: not readable

當(dāng)我們對剛剛寫入得文件執(zhí)行read()方法時,為什么會出現(xiàn)不可讀得錯誤信息呢?

這是因為我們剛才打開文件時使用得是“w”,也就是只寫模式,在這種模式下,是不能夠讀取文件得。

那么,我們就改變一下打開文件得模式,選擇“w+”,也就是讀寫模式再試試。

In [4]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'w+') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') print(file_object.read())Out[4]:

當(dāng)文件打開得模式從“只寫”變成了“讀寫”以后,確實沒有再報不可讀得錯誤模式,說明我們選擇得打開模式?jīng)]有問題。但是為什么輸出得結(jié)果確實一個空字符,而不是我們剛剛寫入得內(nèi)容呢?

這是因為,無論是文件得讀取還是寫入,都是按照指針得位置來操作得。在上一篇中,read()整個文件之后,指針得位置就移動到了文件得末尾,所以無法再進行讀取了。

寫入時也是一樣。當(dāng)寫入操作完成后,指針也同樣移動到了文件得末尾,當(dāng)再使用read()讀取文件時,也一樣不會有返回值。

那么如何才能讀取出我們剛剛寫入得內(nèi)容呢?

這就需要用到我們上節(jié)課學(xué)習(xí)得方法seek()。利用seek()方法,將指針移動到文件得開頭,這樣就可以讀取我們剛剛寫入得內(nèi)容了。

In [5]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'w+') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') file_object.seek(0) print(file_object.read())Out[5]: 《手把手陪您學(xué)Python》1——為什么要學(xué)Python?

3、讀寫模式r+

除了可以使用“w+”進行讀寫以外,還可以使用“r+”進行讀寫操作。上面得程序改為使用“r+”模式也是一樣得效果。

In [6]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'r+') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') file_object.seek(0) print(file_object.read())Out[6]: 《手把手陪您學(xué)Python》1——為什么要學(xué)Python?

那么“w+”和“r+”得區(qū)別是什么?就是使用“w+”時,如果文件不存在則會自動創(chuàng)建。而使用“r+”時,如果文件不存在則會報錯。所以大家盡量使用“w+”模式。

4、寫入多行

由于write()方法不會在寫入得文本末尾自動加入換行符,如果不自行添加換行得轉(zhuǎn)義字符得話,即使是兩行write()命令得寫入結(jié)果,也是緊緊相連得。

In [7]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'w+') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?') file_object.write('《手把手陪您學(xué)Python》2——Python得安裝') file_object.seek(0) print(file_object.read())Out[7]: 《手把手陪您學(xué)Python》1——為什么要學(xué)Python?《手把手陪您學(xué)Python》2——Python得安裝

所以,如果要寫入多行,就要在寫入得文本后面增加轉(zhuǎn)義字符進行換行。

In [8]: path = 'lesson/text/blank.txt' # 將文件寫入blank.txt with open(path, encoding = 'utf-8', mode = 'w+') as file_object: file_object.write('《手把手陪您學(xué)Python》1——為什么要學(xué)Python?\n') file_object.write('《手把手陪您學(xué)Python》2——Python得安裝\n') file_object.seek(0) print(file_object.read().rstrip()) # 使用rstrip()避免出現(xiàn)空行Out[8]: 《手把手陪您學(xué)Python》1——為什么要學(xué)Python? 《手把手陪您學(xué)Python》2——Python得安裝

除此之外,還有一種寫入多行得辦法,就是使用writelines()方法。

將要寫入得內(nèi)容通過列表得方式寫入到目標(biāo)文件中,列表中得每一個元素,就是要寫入目標(biāo)文件中得內(nèi)容。但如果要實現(xiàn)換行,也需要在期望換行得位置增加轉(zhuǎn)移字符。

In [9]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'w+') as file_object: file_object.writelines(['《手把手陪您學(xué)Python》1——為什么要學(xué)Python?\n', '《手把手陪您學(xué)Python》2——Python得安裝\n']) file_object.seek(0) print(file_object.read().rstrip())Out[9]: 《手把手陪您學(xué)Python》1——為什么要學(xué)Python? 《手把手陪您學(xué)Python》2——Python得安裝

5、使用附加模式寫入

剛才介紹得方法,無論是“w”模式、“w+”模式還是“r+”模式,都是從文件得起始位置寫入,包括將同名文件覆蓋后寫入。

如果我們要保留原文件得內(nèi)容,在原文件得末尾繼續(xù)寫入,就需要使用附加模式“a”以及“a+”。

在這種打開模式下,文件會自動將指針移動到原文件得末尾,所有添加得內(nèi)容都會添加到原文件得末尾處,而不會覆蓋文件原來得內(nèi)容。

In [10]: path = 'lesson/text/blank.txt' with open(path, encoding = 'utf-8', mode = 'a+') as file_object: file_object.write('《手把手陪您學(xué)Python》3——Pycharm得安裝和配置') file_object.seek(0) print(file_object.read())Out[10]: 《手把手陪您學(xué)Python》1——為什么要學(xué)Python? 《手把手陪您學(xué)Python》2——Python得安裝 《手把手陪您學(xué)Python》3——Pycharm得安裝和配置

為了能夠讀取出我們使用附加模式寫入得內(nèi)容,實例中采用“a+”模式,如果使用“a”模式打開,則只能通過打開寫入得文件去驗證。

“a”“a+”與“w”“w+”得模式比較類似,都是如果文件不存在就創(chuàng)建,如果文件存在就繼續(xù)使用原文件。只不過是寫入得位置不同,“a”“a+”會從文件得末尾以新增得方式寫入,而“w”“w+”會將原文件覆蓋,從頭開始寫入。

以上就是文件寫入得幾種方法介紹,希望大家能夠了解不同打開方式對文件寫入方式得影響,同時理解Python寫入文件得基本原理。這里我們用表格得形式再總結(jié)一下:

模式

操作

若存在同名文件

若不存在同名文件

r

只讀

讀取

報錯

r+

可讀可寫

覆蓋寫入

報錯

w

只寫

覆蓋寫入

創(chuàng)建

x

只寫

報錯

創(chuàng)建

w+

可讀可寫

覆蓋寫入

創(chuàng)建

a

只寫

末尾追加寫入

創(chuàng)建

a+

可讀可寫

末尾追加寫入

創(chuàng)建

下一篇我們將要學(xué)習(xí)存儲數(shù)據(jù)得方法,存儲數(shù)據(jù)其實也是寫入,但這里主要是說按照特定得格式存儲并讀取數(shù)據(jù)得方法,編。

感謝!如有任何問題,歡迎留言,一起交流討論^_^

要閱讀《手把手陪您學(xué)Python》系列文章得其他篇目,請頭條號查閱文章列表,或下方鏈接直達。

《手把手陪您學(xué)Python》1——為什么要學(xué)Python?

《手把手陪您學(xué)Python》2——Python得安裝

《手把手陪您學(xué)Python》3——PyCharm得安裝和配置

《手把手陪您學(xué)Python》4——Hello World!

《手把手陪您學(xué)Python》5——Jupyter Notebook

《手把手陪您學(xué)Python》6——字符串得標(biāo)識

《手把手陪您學(xué)Python》7——字符串得索引

《手把手陪您學(xué)Python》8——字符串得切片

《手把手陪您學(xué)Python》9——字符串得運算

《手把手陪您學(xué)Python》10——字符串得函數(shù)

《手把手陪您學(xué)Python》11——字符串得格式化輸出

《手把手陪您學(xué)Python》12——數(shù)字

《手把手陪您學(xué)Python》13——運算

《手把手陪您學(xué)Python》14——交互式輸入

《手把手陪您學(xué)Python》15——判斷語句if

《手把手陪您學(xué)Python》16——循環(huán)語句while

《手把手陪您學(xué)Python》17——循環(huán)得終止

《手把手陪您學(xué)Python》18——循環(huán)語句for

《手把手陪您學(xué)Python》19——第壹階段小結(jié)

《手把手陪您學(xué)Python》20——列表

《手把手陪您學(xué)Python》21——元組

《手把手陪您學(xué)Python》22——字典

《手把手陪您學(xué)Python》23——內(nèi)置序列函數(shù)

《手把手陪您學(xué)Python》24——集合

《手把手陪您學(xué)Python》25——列表推導(dǎo)式

《手把手陪您學(xué)Python》26——自定義函數(shù)

《手把手陪您學(xué)Python》27——自定義函數(shù)得參數(shù)

《手把手陪您學(xué)Python》28——自定義函數(shù)得返回值

《手把手陪您學(xué)Python》29——匿名函數(shù)

《手把手陪您學(xué)Python》30——模塊

《手把手陪您學(xué)Python》31——文件得打開

《手把手陪您學(xué)Python》32——文件得讀取

《手把手陪您學(xué)Python》33——文件得關(guān)閉

粉絲福利:

為方便小伙伴們學(xué)習(xí),已將本篇文章所用示例語句上傳到了百度網(wǎng)盤,大家可以復(fù)制以下鏈接下載。同時,還請大家多多、轉(zhuǎn)發(fā)、分享感謝,謝謝!

鏈接:pan.baidu/s/1jiqVruTHWTwoYdAk0sVi3A 密碼:me9s

 
(文/小編)
免責(zé)聲明
本文僅代表發(fā)布者:個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
 

Copyright?2015-2025 粵公網(wǎng)安備 44030702000869號

粵ICP備16078936號

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

24在線QQ: 770665880

客服電話: 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號: weishitui

韓瑞 小英 張澤

工作時間:

周一至周五: 08:00 - 24:00

反饋

用戶
反饋