python的文件操作和異常處理

文件的介紹

1苛坚、什么是文件比被?

如下圖展示數(shù)據(jù)

2 文件的作用

使用文件的目的:保存數(shù)據(jù)存放在磁盤(pán)

把一些存儲(chǔ)存放起來(lái),可以讓程序下一次執(zhí)行的時(shí)候直接使用泼舱,而不必重新制作一份等缀,省時(shí)省力

二、文件的打開(kāi)與關(guān)閉

思考:如果想用word編寫(xiě)一份簡(jiǎn)歷娇昙,應(yīng)該有哪些流程呢尺迂?

步驟:新建--寫(xiě)入數(shù)據(jù)--關(guān)閉

打開(kāi)word軟件,新建一個(gè)word文件寫(xiě)入個(gè)人簡(jiǎn)歷信息保存文件關(guān)閉word軟件

同樣冒掌,在操作文件的整體過(guò)程與使用word編寫(xiě)一份簡(jiǎn)歷的過(guò)程是很相似的

結(jié)論

打開(kāi)文件噪裕,或者新建立一個(gè)文件讀/寫(xiě)數(shù)據(jù)關(guān)閉文件

?打開(kāi)文件

在python,使用open函數(shù)股毫,可以打開(kāi)一個(gè)已經(jīng)存在的文件膳音,或者創(chuàng)建一個(gè)新文件open(文件名,訪問(wèn)模式)

格式

f=open(‘文件’,'w')或者f=open('文件','r')

如下圖所示:不同的打開(kāi)文件的方式

常見(jiàn)的文件操作有:寫(xiě)铃诬,讀祭陷,追加

寫(xiě)數(shù)據(jù)(write)

格式

對(duì)象=open("文件",w)對(duì)象.write("寫(xiě)入數(shù)據(jù)")對(duì)象.close

案例:以寫(xiě)的方式打開(kāi)文件,寫(xiě)入數(shù)據(jù)

f=open('test.txt','w')f.write('hello world, i am here!')f.close()

繼續(xù)寫(xiě)入數(shù)據(jù)

f=open('test.txt','w')f.write('I love you')f.close()

總結(jié):

如果文件不存在那么創(chuàng)建趣席,如果存在那么就先清空兵志,然后寫(xiě)入數(shù)據(jù)

讀數(shù)據(jù)(read)

案例:以讀的方式打開(kāi)文件,讀取數(shù)據(jù)

格式

對(duì)象 = open("文件",r)變量 = 對(duì)象.read()print(變量)

案例:讀取文件(test.txt)

f=open('test.txt','r')content=f.read()print(content)

總結(jié):

如果用open打開(kāi)文件時(shí)宣肚,如果使用的"r"想罕,那么可以省略,即只寫(xiě)open('test.txt')如果沒(méi)有文件钉寝,打開(kāi)報(bào)錯(cuò)弧呐,存在該文件才能操作如果文件中存在中文顯示,會(huì)出現(xiàn)亂碼需要添加encoding='utf-8'open(‘test.txt’,”r”,encoding='utf-8')

思考:如果只想讀取幾個(gè)字怎么操作?

案例:讀取指定長(zhǎng)度的數(shù)據(jù)(單位是字節(jié))

f = open('test.txt', 'r')content = f.read(5)? # 最多讀取5個(gè)數(shù)據(jù)print(content)

注意:

使用read(num)可以從文件中讀取數(shù)據(jù)嵌纲,num表示要從文件中讀取的數(shù)據(jù)的長(zhǎng)度(單位是字節(jié))俘枫,如果沒(méi)有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)

讀數(shù)據(jù)(readlines)

就像read沒(méi)有參數(shù)時(shí)一樣逮走,readlines可以按照行的方式把整個(gè)文件中的內(nèi)容進(jìn)行一次性讀取鸠蚪,并且返回的是一個(gè)列表,其中每一行的數(shù)據(jù)為一個(gè)元素

格式

對(duì)象=open("文件",r)變量=對(duì)象.readlines()print(變量)

案例:讀取文件(test.txt)

f = open('test.txt', 'r')content = f.readlines()print(content)print(type(content))

讀數(shù)據(jù)(readline)

readline可以按照行的方式把整個(gè)文件中的內(nèi)容進(jìn)行一行一行的讀取

格式

對(duì)象=open("文件",r)變量=對(duì)象.readline()print(變量)

案例师溅,一行一行讀取

f=open('a.txt','r',encoding='utf-8')whileTrue:content=f.readline()ifcontent:print(content)else:break

可寫(xiě)(a)

格式

對(duì)象=open("",a)對(duì)象.write("寫(xiě)入數(shù)據(jù)")對(duì)象.close

案例茅信,在文件中寫(xiě)入數(shù)據(jù)

f=open("test.txt",a)f.write("新的數(shù)據(jù)")對(duì)象.close

總結(jié):

(可寫(xiě))形式打開(kāi)文件,如果文件不存在則創(chuàng)建并從頭添加寫(xiě)入的內(nèi)容墓臭,存在則原有數(shù)據(jù)后追加數(shù)據(jù)

讀數(shù)據(jù)(rb)

格式1

對(duì)象 = open("二進(jìn)制文件",rb)變量= 對(duì)象.read()print(變量)

格式2

withopen("二進(jìn)制文件","rb")as對(duì)象:變量=對(duì)象.read()print(變量)

案例:使用盡可能多的方式實(shí)現(xiàn)讀取圖片

f = open('33.jpg', 'rb')content = f.read()print(content)

withopen("33.jpg","rb")asrf:res=rf.read()print(res)

使用習(xí)慣:格式2中不需要手動(dòng)關(guān)閉文件蘸鲸,所以經(jīng)常被使用

總結(jié)

如果沒(méi)有文件,打開(kāi)報(bào)錯(cuò)窿锉,存在該文件才能操作

?寫(xiě)數(shù)據(jù)(wb)

格式

withopen("二進(jìn)制文件","wb")as對(duì)象:變量=對(duì)象.write()print(變量)

案例:備份圖片

withopen("1.jpg","rb")asrf:res=rf.read()withopen("textjpg.jpg","wb")aswf:res=wf.write(res)print(res)

?關(guān)閉文件

格式

close()

思考題

如果一個(gè)文件很大酌摇,比如5G膝舅,試想應(yīng)該怎樣把文件的數(shù)據(jù)讀取到內(nèi)存然后進(jìn)行處理呢?

調(diào)用read()會(huì)一次性讀取文件的全部?jī)?nèi)容窑多,如果文件有10G仍稀,內(nèi)存就爆了,所以埂息,要保險(xiǎn)起見(jiàn)技潘,可以反復(fù)調(diào)用read(size)方法?每次最多讀取size個(gè)字節(jié)的內(nèi)容。另外千康,調(diào)用readline()可以每次讀取一行內(nèi)容享幽,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list?因此,要根據(jù)需要決定怎么調(diào)用拾弃。如果文件很小琉闪,read()一次性讀取最方便;如果不能確定文件大小砸彬,反復(fù)調(diào)用read(size)比較保險(xiǎn);如果是配置文件斯入,調(diào)用readlines()最方便

三砂碉、文件和文件夾的操作

文件的相關(guān)操作

有些時(shí)候,需要對(duì)文件進(jìn)行重命名刻两、刪除等一些操作增蹭,python的os模塊中都有這么功能

文件重命名

os模塊中的rename()可以完成對(duì)文件的重命名操作

格式

importosos.rename("需要修改的文件名","新文件名")

案例:

importosos.rename("test.txt","new.txt")

刪除文件

os模塊中的remove()可以完成對(duì)文件的重命名操作

格式

importosos.remove("文件名")

案例:

importosos.rename("new.txt")

文件夾的相關(guān)操作

創(chuàng)建文件夾

os模塊中的mkdir()可以完成對(duì)文件的重命名操作

獲取當(dāng)前目錄

os模塊中的getcwd()可以獲取當(dāng)前目錄

四、異常

1:什么是異常磅摹?

異常即是一個(gè)事件滋迈,該事件會(huì)在程序執(zhí)行過(guò)程中發(fā)生,影響了程序的正常執(zhí)行户誓。

一般情況下饼灿,在Python無(wú)法正常處理程序時(shí)就會(huì)發(fā)生一個(gè)異常。

異常是Python對(duì)象帝美,表示一個(gè)錯(cuò)誤碍彭。

當(dāng)Python腳本發(fā)生異常時(shí)我們需要捕獲處理它,否則程序會(huì)終止執(zhí)行悼潭。

演示異常

f=open("123.txt","r")#FileNotFoundError: [Errno 2] No such file or directory: '123.txt'list=[1,2,3]print(list[4])#IndexError: list index out of rangestr="jack"str.index("v")ValueError:substringnotfoundc=5/0print(c)#ZeroDivisionError: division by zero

?異常處理

作用

捕捉異潮蛹桑可以使用try/except語(yǔ)句。try/except語(yǔ)句用來(lái)檢測(cè)try語(yǔ)句塊中的錯(cuò)誤舰褪,從而讓except語(yǔ)句捕獲異常信息并處理皆疹。如果你不想在異常發(fā)生時(shí)結(jié)束你的程序,只需在try里捕獲它占拍。

?語(yǔ)法

以下為簡(jiǎn)單的try....except...else的語(yǔ)法

try:<語(yǔ)句>#運(yùn)行別的代碼except<名字>:<語(yǔ)句>#如果在try部份引發(fā)了'name'異常else:<語(yǔ)句>#如果沒(méi)有異常發(fā)生

代碼

try:open("qwe.txt","r")print("123")exceptFileNotFoundError:print("異常處理")else:print("沒(méi)有異常")

try:open("qwe.txt","r")print("123")exceptFileNotFoundErrorasresult:print("異常處理",result)else:print("沒(méi)有異常")

使用except而不帶任何異常類型

你可以不帶任何異常類型使用except略就,如下實(shí)例

語(yǔ)法

try:正常的操作except:發(fā)生異常捎迫,執(zhí)行這塊代碼else:如果沒(méi)有異常執(zhí)行這塊代碼

代碼

try:open("qwe.txt","r")print("123")except:print("異常處理")else:print("沒(méi)有異常")

注意:以上方式try-except語(yǔ)句捕獲所有發(fā)生的異常。但這不是一個(gè)很好的方式残制,我們不能通過(guò)該程序識(shí)別出具體的異常信息立砸。因?yàn)樗东@所有的異常。

使用except而帶多種異常類型

語(yǔ)法

try:異常的操作except(Exception1[,Exception2[,...ExceptionN]]]):發(fā)生以上多個(gè)異常中的一個(gè)初茶,執(zhí)行這塊代碼......................else:如果沒(méi)有異常執(zhí)行這塊代碼

代碼

list=[1,2,3,4]try:open("qwe.txt","r")list[7]except(NameError,FileNotFoundError)asrese:print("出現(xiàn)異常")else:print("沒(méi)有異常")

try-finally 語(yǔ)句

try-finally語(yǔ)句無(wú)論是否發(fā)生異常都將執(zhí)行最后的代碼

語(yǔ)法

try:<語(yǔ)句>finally:<語(yǔ)句>#退出try時(shí)總會(huì)執(zhí)行

案例

try:fh=open("test.txt","r")fh.readlines()fh.close()finally:print("Error: 沒(méi)有找到文件或讀取文件失敗")

注意:當(dāng)在try塊中拋出一個(gè)異常颗祝,立即執(zhí)行finally塊代碼。

finally塊中的所有語(yǔ)句執(zhí)行后恼布,異常被再次觸發(fā)螺戳,并執(zhí)行except塊代碼。

參數(shù)的內(nèi)容不同于異常

?異常的傳遞

代碼

deffunc1():print("---func1--1---")print(num)print("---func1--2---")# def func2():#? ? print("--func2--1---")#? ? func1()#? ? print("--func2--2---")deffunc3():try:print("---func3--1---")func1()print("--func3--2----")exceptExceptionasresult:print(result)print("--func3---3---")func3()#func2()

觸發(fā)異常

可以使用raise語(yǔ)句自己觸發(fā)異常

案例:輸入考生的成績(jī)(0~100)

deffunctionName(score):ifscore<0orscore>100:raiseException("Invalid score!",score)# 觸發(fā)異常后折汞,后面的代碼就不會(huì)再執(zhí)行functionName(200)

用戶自定義異常

定義

通過(guò)創(chuàng)建一個(gè)新的異常類倔幼,程序可以命名它們自己的異常。異常應(yīng)該是典型的繼承自Exception類爽待,通過(guò)直接或間接的方式

代碼:長(zhǎng)度不低于3為

classShortInputException(Exception):def__init__(self,length,atleast):self.length=length? ? ? ? self.atleast=atleastdefmain():try:s=input('請(qǐng)輸入 --> ')iflen(s)<3:# raise引發(fā)一個(gè)你定義的異常raiseShortInputException(len(s),3)exceptShortInputExceptionasresult:#x這個(gè)變量被綁定到了錯(cuò)誤的實(shí)例print('ShortInputException: 輸入的長(zhǎng)度是 %d,長(zhǎng)度至少應(yīng)是 %d'%(result.length,result.atleast))else:print('沒(méi)有異常發(fā)生')main()

五损同、模塊

Python 模塊(Module),是一個(gè)Python文件鸟款,以.py 結(jié)尾膏燃,包含了Python 對(duì)象定義和Python語(yǔ)句

下例是個(gè)簡(jiǎn)單的模塊 aa.py:

deftest1():print("我是模塊1")deftest2():print("我是模塊2")

模塊的引入

import

模塊定義好后,我們可以使用 import 語(yǔ)句來(lái)引入模塊何什,語(yǔ)法如下

importmodule1[,module2[,...moduleN]]

test.py 文件代碼

importaaaa.test1()aa.test2()#我是模塊1#我是模塊2

導(dǎo)入python中的模塊os/math

代碼:開(kāi)平方根

importmathprint(math.sqrt(4))#2

注意:一個(gè)模塊只會(huì)被導(dǎo)入一次组哩,不管你執(zhí)行了多少次。這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行处渣。

from…import 語(yǔ)句

Python 的 from 語(yǔ)句讓你從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中伶贰,語(yǔ)法如下

frommodnameimportname1[,name2[,...nameN]]

test.py 文件代碼

fromaaimporttest1test1()#我是模塊1

注意:只能調(diào)用導(dǎo)入的模塊中的部分,如果想使用test2,需要如下操作

fromaaimporttest1,test2test1()test2()#我是模塊1#我是模塊2

思考:如果需要導(dǎo)入模塊中的部分有很多罐栈,怎么操作?

from…import * 語(yǔ)句

把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的黍衙,只需使用如下聲明:

frommodnameimport*

test.py 文件代碼

fromaaimport*test1()test2()#我是模塊1#我是模塊2

擴(kuò)展

使用__all__魔幻方法當(dāng)被引入的包中有__all__=(),里面指定的才能被調(diào)用,調(diào)用的時(shí)候使用from模塊名import*

aa.py

__all__=('test1','test2')deftest1():print("我是模塊1")deftest2():print("我是模塊2")deftest3():print("我是模塊2")

test.py

fromaaimport*test1()test2()

六荠诬、Python中的包

包是一個(gè)分層次的文件目錄結(jié)構(gòu)们豌,它定義了一個(gè)由模塊及子包,和子包下的子包等組成的 Python 的應(yīng)用環(huán)境浅妆。

簡(jiǎn)單來(lái)說(shuō)望迎,包就是文件夾,但該文件夾下必須存在init.py 文件, 該文件的內(nèi)容可以為空凌外。init.py 用于標(biāo)識(shí)當(dāng)前文件夾是一個(gè)包辩尊。

考慮一個(gè)在 day 目錄下的 runoob1.py、runoob2.py康辑、init.py 文件摄欲,test.py 為測(cè)試調(diào)用包的代碼轿亮,目錄結(jié)構(gòu)如下

test.pyday|--__init__.py|--runoob1.py|--runoob2.py

源代碼如下:

day/runoob1.py

defrunoob1():print"I'm in runoob1"

day/runoob2.py

defrunoob2():print"I'm in runoob2"

然后我們?cè)?day同級(jí)目錄下創(chuàng)建 test.py 來(lái)調(diào)用 day 包

# 導(dǎo)入 Phone 包fromday.runoob1importrunoob1fromday.runoob2importrunoob2runoob1()runoob2()

結(jié)果

I'minrunoob1I'minrunoob2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胸墙,隨后出現(xiàn)的幾起案子我注,更是在濱河造成了極大的恐慌,老刑警劉巖迟隅,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件但骨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡智袭,警方通過(guò)查閱死者的電腦和手機(jī)奔缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吼野,“玉大人校哎,你說(shuō)我怎么就攤上這事⊥剑” “怎么了闷哆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)单起。 經(jīng)常有香客問(wèn)我阳准,道長(zhǎng),這世上最難降的妖魔是什么馏臭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮讼稚,結(jié)果婚禮上括儒,老公的妹妹穿的比我還像新娘。我一直安慰自己锐想,他們只是感情好帮寻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著赠摇,像睡著了一般固逗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藕帜,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天烫罩,我揣著相機(jī)與錄音,去河邊找鬼洽故。 笑死贝攒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的时甚。 我是一名探鬼主播隘弊,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哈踱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了梨熙?” 一聲冷哼從身側(cè)響起开镣,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咽扇,沒(méi)想到半個(gè)月后邪财,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肌割,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年卧蜓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片把敞。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弥奸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奋早,到底是詐尸還是另有隱情盛霎,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布耽装,位于F島的核電站愤炸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掉奄。R本人自食惡果不足惜规个,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姓建。 院中可真熱鬧诞仓,春花似錦、人聲如沸速兔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涣狗。三九已至谍婉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镀钓,已是汗流浹背穗熬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丁溅,地道東北人死陆。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親措译。 傳聞我的和親對(duì)象是個(gè)殘疾皇子别凤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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