Python 極簡教程(二十五) - IO(文件讀寫)

這里講的文件讀寫窍奋,是由 Python 提供的最基礎(chǔ)的文件讀寫荐健,主要是對文本文件和二進(jìn)制文件的讀寫。

如果想要操作 excel琳袄, csv江场,ymal,xml窖逗,json 等特定格式的文件址否,需要特定的庫進(jìn)行處理。

文本文件:在 windows 上但凡能用記事本正常打開的文件都是文本文件碎紊,比如 .txt佑附,.log用含,.py 等;
二進(jìn)制文件:可執(zhí)行文件帮匾,圖片文件,視頻文件等痴鳄。

Python 提供了 open()函數(shù)用于文件讀寫瘟斜。

f = open(文件路徑,讀寫方式)

open() 函數(shù)主要參數(shù)有兩個(gè):

文件路徑:包含文件名的路徑痪寻,如 D:\nemo\io.txt螺句;
讀寫方式:指定打開文件的模式,比如只讀('r')橡类,只寫('w')蛇尚,追加('a')等。

open() 函數(shù)會(huì)根據(jù)讀寫方式將文件加載到內(nèi)存中顾画,返回一個(gè)文件對象取劫。f 變量就是用來保存這個(gè)對象的。所有后續(xù)就可以使用 f 變量對該文件進(jìn)行讀寫操作研侣。

所有情況下文件操作主要包含如下三個(gè)步驟:

  1. 調(diào)用 open() 函數(shù)打開文件
  2. 進(jìn)行文件操作谱邪,讀、寫庶诡、追加等
  3. 關(guān)閉文件

在使用 open() 函數(shù)的時(shí)候惦银,必須要根據(jù)需要使用對應(yīng)的讀寫方式:

讀寫方式 操作 說明
r 只讀 以只讀方式打開,文件不存在會(huì)報(bào)錯(cuò)末誓。默認(rèn)方式扯俱,可以不用寫。
w 只寫 不能讀取喇澡,只能寫入迅栅。
文件不存在就創(chuàng)建,文件存在則覆蓋(清空原來的內(nèi)容)撩幽。
a 追加 不能讀取库继,只能寫入,在文件的末尾追加窜醉。
文件不存在就創(chuàng)建宪萄,文件存在則在末尾追加
x 新建 文件存在則會(huì)報(bào)錯(cuò)榨惰,文件不存在就新建并支持寫入拜英。
比 w 方式安全,w 方式會(huì)覆蓋原有內(nèi)容琅催,誤操作可能造成數(shù)據(jù)丟失居凶。
rb 二進(jìn)制只讀 同 r 虫给,只是操作對象為二進(jìn)制文件,使用 bytes 類型讀侠碧。
wb 二進(jìn)制只寫 同 w抹估,寫入類型必須是 bytes 類型
ab 二進(jìn)制追加 同 a,寫入類型必須是 bytes 類型
+ 可讀寫 r+弄兜,w+药蜻,a+,rb+替饿,wb+语泽,ab+,帶加號(hào)代表既可寫也可讀

文件操作

我們先準(zhǔn)備一個(gè)文件:

文件讀寫

這個(gè)文件放在 D:\data\pythonIO中视卢,文件名為test_read.txt踱卵。

注意,很多人 windows 沒有開啟擴(kuò)展名据过⊥锷埃看到的文件名沒有.txt后綴,那么一定要開啟绳锅,文件名+后綴名才是完整的文件名班利。如何開啟?點(diǎn)我榨呆!

好了罗标,文件已經(jīng)準(zhǔn)備好,接下來就使用 Python 代碼進(jìn)行文件操作了积蜻。

文件讀取

我們先以只讀方式打開闯割,讀寫方式為r

f = open(r'D:\data\pythonIO\test_read.txt', 'r') 
# 默認(rèn)是文本只讀竿拆,所以'r'其實(shí)可以不寫

data = f.read()   # 讀取文件所有內(nèi)容

f.close() # 文件打開必須要關(guān)閉

print(data)
'''
Python教程
0基礎(chǔ)入門切忌追求大而全
快速掌握必要基礎(chǔ)語法
再進(jìn)行有一定目的和趣味的練習(xí)
才能避免從入門到放棄的悲劇
'''

上例中宙拉,我們使用了只讀r的方式打開了文件。

Python 中提供的文件讀取方法如下:

f.read()

一次性讀取文件中所有內(nèi)容丙笋。

read() 方法有一個(gè)默認(rèn)參數(shù) size惫企,用來指定讀取的字符數(shù)晃虫。當(dāng)文件過大時(shí),一次性讀取內(nèi)存扛不住,就可以使用 read(size) 來循環(huán)讀取豫缨。

還是以上面的例子中的文件為例:

f = open(r'D:\data\pythonIO\test_read.txt', ) 

print(f.read(8))  # 讀取5個(gè)字符
# Python教程

f.close() 

注意缩举,size 在文本讀取時(shí)表示字符個(gè)數(shù)洁奈。而以二進(jìn)制方式打開時(shí)串慰,size 表示字節(jié)數(shù)

f.readline()
一行行讀取,遇到 \n 或 \r\n 等換行符時(shí)停止钉答。換行符础芍,我們在文件中看不到,一般只要你通過回車換行数尿,就會(huì)自動(dòng)生成一個(gè)換行符仑性。

f = open(r'D:\data\pythonIO\test_read.txt', ) 

print(f.readline()) # 讀取第一行內(nèi)容
# Python教程
print(f.readline()) # 再次調(diào)用,讀取第二行
# 0基礎(chǔ)入門切忌追求大而全

f.close() 

f.readlines()
按行讀取所有內(nèi)容右蹦,返回一個(gè)列表虏缸。文件中的每行內(nèi)容為列表的一個(gè)元素。

f = open(r'D:\data\pythonIO\test_read.txt', ) 

print(f.readlines()) # 讀取第一行內(nèi)容
# ['Python教程\n', '0基礎(chǔ)入門切忌追求大而全\n', '快速掌握必要基礎(chǔ)語法\n', '再進(jìn)行有一定目的和趣味的練習(xí)\n', '才能避免從入門到放棄的悲劇\n']

f.close() 

這種方式讀出為列表嫩实,所以可以按照列表的方式靈活處理讀取的內(nèi)容。但是同樣也要注意的窥岩,這種方法會(huì)讀取整個(gè)文件內(nèi)容甲献,如果文件過大則可能會(huì)占用大量的內(nèi)存。

文件寫入

文件寫入有三種方式:

w:覆蓋寫入颂翼,當(dāng)文件存在時(shí)會(huì)覆蓋文件晃洒,文件不存在則創(chuàng)建
a:追加寫入,當(dāng)文件存在時(shí)在末尾寫入朦乏,文件不存在則創(chuàng)建
x:新建文件球及,當(dāng)文件存在時(shí)報(bào)錯(cuò),文件不存在則創(chuàng)建

以上呻疹,讀寫方式不同吃引,導(dǎo)致會(huì)產(chǎn)生不同的結(jié)果。如果是 w 方式的話 刽锤,一定要注意文件覆蓋镊尺。

對于文件寫入,主要的方法如下:

f.write()

將內(nèi)容寫入文件并思,并返回寫入的字符數(shù)庐氮。但是要注意,寫入過程都是在內(nèi)存中進(jìn)行的宋彼,并不會(huì)馬上體現(xiàn)在文件中弄砍,直到 f.close() 的時(shí)候,才會(huì)將內(nèi)存中的內(nèi)容實(shí)際寫入文件输涕。

f = open(r'D:\data\pythonIO\test_read.txt', 'w+')
f.write('極簡教程')
# 4
f.close()

你會(huì)發(fā)現(xiàn)原來的內(nèi)容被修改了音婶。

文件指針

文件讀寫過程中莱坎,存在文件指針的概念桃熄,當(dāng)你讀取一部分內(nèi)容后,指針位置就會(huì)后移,這樣就只能讀取后面的內(nèi)容瞳收。
如果你想讀取已讀取過的內(nèi)容怎么辦呢碉京?也不是沒有辦法,Python 提供了seek螟深,tell兩個(gè)方法來處理指針谐宙。

f.tell()
獲取文件指針當(dāng)前所在的位置。不過要注意的是界弧,它是從文件開頭算起凡蜻,到當(dāng)前位置的字節(jié)數(shù)

f = open(r'D:\data\pythonIO\test_read.txt', 'r')

print(f.read(8)) # 讀取8個(gè)字符
# Python教程
print(f.tell()) # 打印當(dāng)前位置
# 10
f.close()

讀取了8個(gè)字符垢箕,但是返回的位置是10划栓。因?yàn)槲覀兊奈募杏袧h字,一個(gè)漢字是兩個(gè)字節(jié)条获。我們讀出來的 8 個(gè)字符中有兩個(gè)漢字忠荞,所以當(dāng)前的位置是 10(第 10 個(gè)字節(jié))。

f.seek()
通過 f.seek() 方法可以修改指針的位置帅掘。這個(gè)方法有兩個(gè)參數(shù)委煤,f.seek(target, whence)。target 用于指定修改指針的位置修档,whence用于指定修改指針位置時(shí)從哪里開始計(jì)算(0碧绞,表示從文件開始,1吱窝,表示從當(dāng)前位置讥邻,2,表示從文件末尾院峡。默認(rèn)為0)

注意计维,如果文件不是以二進(jìn)制方式打開,whence 只能取 0撕予,也就是只能從文件開始計(jì)算偏移量鲫惶。

f = open(r'D:\data\pythonIO\test_read.txt', 'r')

f.read(8) # 讀取8個(gè)字符
# Python教程
f.tell() # 打印當(dāng)前位置
# 10
f.seek(0)  # 移到文件開頭
# 0
f.seek(5)  # 移到從文件開始算第5個(gè)字節(jié)位置
# 5
f.seek(-3, 1) # 從當(dāng)前位置向前移動(dòng)3個(gè)字節(jié),會(huì)報(bào)錯(cuò)
# io.UnsupportedOperation: can't do nonzero end-relative seeks
f.close()

使用rb方式打開实抡,才能使用 whence 參數(shù)的另外兩個(gè)值欠母,也就是從當(dāng)前位置或者文件末尾計(jì)算。因?yàn)橐粋€(gè)漢字是兩個(gè)字符吆寨,你如果按字節(jié)移動(dòng)的時(shí)候就無法正常讀取了赏淌。

比如某個(gè)漢字占了5和6位字節(jié)(一個(gè)漢字占兩個(gè)字節(jié)),這時(shí)候你移到6啄清,那怎么讀呢六水?讀這個(gè)漢字的一半?

f = open(r'D:\data\pythonIO\test_read.txt', 'rb')

f.read(8) # 讀取8個(gè)字節(jié)
# b'Python\xbd\xcc'
f.tell() # 打印當(dāng)前位置
# 8
f.seek(-5,1) # 從當(dāng)前位置向前移動(dòng)5個(gè)字節(jié)
# 3
f.seek(-5, 2) # 從文件末尾向前移動(dòng)5個(gè)字節(jié)
# 112
f.seek(0, 2)  # 移動(dòng)到文件末尾
# 117

f.close()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掷贾,隨后出現(xiàn)的幾起案子睛榄,更是在濱河造成了極大的恐慌,老刑警劉巖想帅,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件场靴,死亡現(xiàn)場離奇詭異,居然都是意外死亡港准,警方通過查閱死者的電腦和手機(jī)旨剥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅缸,“玉大人轨帜,你說我怎么就攤上這事●媒罚” “怎么了蚌父?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烟具。 經(jīng)常有香客問我,道長奠蹬,這世上最難降的妖魔是什么朝聋? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮囤躁,結(jié)果婚禮上冀痕,老公的妹妹穿的比我還像新娘。我一直安慰自己狸演,他們只是感情好言蛇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宵距,像睡著了一般腊尚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上满哪,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天婿斥,我揣著相機(jī)與錄音,去河邊找鬼哨鸭。 笑死民宿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的像鸡。 我是一名探鬼主播活鹰,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了志群?” 一聲冷哼從身側(cè)響起着绷,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赖舟,沒想到半個(gè)月后蓬戚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宾抓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年子漩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片石洗。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幢泼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讲衫,到底是詐尸還是另有隱情缕棵,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布涉兽,位于F島的核電站招驴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枷畏。R本人自食惡果不足惜别厘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拥诡。 院中可真熱鬧触趴,春花似錦、人聲如沸渴肉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仇祭。三九已至披蕉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乌奇,已是汗流浹背嚣艇。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留华弓,地道東北人食零。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像寂屏,于是被迫代替她去往敵國和親贰谣。 傳聞我的和親對象是個(gè)殘疾皇子娜搂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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

  • 每一個(gè)單純而直接的當(dāng)下都帶著淡淡的喜悅。
    以行踐言13閱讀 244評論 0 0
  • 今天給自己110分吱抚。全天收獲滿滿的百宇,很開心。 和老同學(xué)三艷秘豹,廖煥輝用心溝通携御,帶他們從悲觀無助的心態(tài)去到對生活充滿了...
    蔡蔡1228閱讀 96評論 0 0
  • spring boot 的啟動(dòng)類: 啟動(dòng)一個(gè)spring boot 程序很簡單,只需要一個(gè)main 函數(shù)就夠了既绕,那...
    wing_yeah閱讀 449評論 0 0