Python教程:文件保礼、異常處理和其他

__name__ == '__main__'?是什么意思沛励?

很多人學(xué)習(xí)python,不知道從何學(xué)起氓英。

很多人學(xué)習(xí)python侯勉,掌握了基本語(yǔ)法過(guò)后,不知道在哪里尋找案例上手铝阐。

很多已經(jīng)做案例的人,卻不知道如何去學(xué)習(xí)更加高深的知識(shí)铐拐。

那么針對(duì)這三類人徘键,我給大家提供一個(gè)好的學(xué)習(xí)平臺(tái),免費(fèi)領(lǐng)取視頻教程遍蟋,電子書籍吹害,以及課程的源代碼!??¤

QQ群:1057034340

通常虚青,在每個(gè)Python項(xiàng)目中它呀,我們都會(huì)看到上面的語(yǔ)句。所以它到底是干什么的棒厘,我們?cè)谶@里就要明白了纵穿。

簡(jiǎn)單地說(shuō),在Python中奢人,?__name__?是一個(gè)特殊的變量谓媒,它告訴我們模塊的名稱。無(wú)論何時(shí)直接運(yùn)行python文件何乎,它都會(huì)在執(zhí)行實(shí)際代碼之前設(shè)置一些特殊變量句惯。?__name__?是一個(gè)特殊變量。根據(jù)以下幾點(diǎn)確定?__name__?變量的值-

如果直接運(yùn)行python文件支救,?__name__?會(huì)將名稱設(shè)置為?main?抢野。

如果你將一個(gè)模塊導(dǎo)入另一個(gè)文件中,?__name__?會(huì)將該名稱設(shè)置為模塊名各墨。

__name__'__main__'

first_module.py.直接運(yùn)行

first_module.py從其他模塊導(dǎo)入

輸出

Infirst_module.py, RunningfromImportInsecond_module.py. Secondmodule’s name: main

上面的示例中指孤,你可以看到,當(dāng)你在另一個(gè)python文件中導(dǎo)入第一個(gè)模塊時(shí)欲主,它將進(jìn)入else條件邓厕,因?yàn)槟K的名稱不是main逝嚎。但是,在second_module.py详恼,名字仍然是main补君。

所以我們?cè)谙旅娴臈l件下使用了

當(dāng)我們想執(zhí)行某些特定任務(wù)時(shí),我們可以直接調(diào)用這個(gè)文件昧互。

如果模塊被導(dǎo)入到另一個(gè)模塊中挽铁,而我們不想執(zhí)行某些任務(wù)時(shí)。

最好是創(chuàng)建一個(gè)main方法敞掘,并在?if __name__ == __main__?內(nèi)部調(diào)用叽掘。因此,如果需要玖雁,你仍然可以從另一個(gè)模塊調(diào)用main方法更扁。

我們?nèi)匀豢梢酝ㄟ^(guò)顯式調(diào)用main方法來(lái)調(diào)用另一個(gè)模塊的main方法,因?yàn)閙ain方法應(yīng)該存在于第一個(gè)模塊中赫冬。

出了問(wèn)題怎么辦

Python中的異常處理

當(dāng)我們用任何編程語(yǔ)言編寫任何程序時(shí)浓镜,有時(shí)即使語(yǔ)句或表達(dá)式在語(yǔ)法上是正確的,也會(huì)在執(zhí)行過(guò)程中出錯(cuò)劲厌。在任何程序執(zhí)行過(guò)程中檢測(cè)到的錯(cuò)誤稱為異常膛薛。

Python中用于處理錯(cuò)誤的基本術(shù)語(yǔ)和語(yǔ)法是try和except語(yǔ)句〔贡牵可以導(dǎo)致異常發(fā)生的代碼放在try塊中哄啄,異常的處理在except塊中實(shí)現(xiàn)。python中處理異常的語(yǔ)法如下-

try 和except

try:? 做你的操作…? ...exceptExceptionI:? 如果有異常ExceptionI风范,執(zhí)行這個(gè)塊咨跌。exceptExceptionII:? 如果有異常ExceptionII,執(zhí)行這個(gè)塊乌企。? ...else:? 如果沒有異常虑润,則執(zhí)行此塊。finally:? 無(wú)論是否有異常加酵,此塊都將始終執(zhí)行

讓我們用一個(gè)例子來(lái)理解這一點(diǎn)拳喻。在下面的示例中,我將創(chuàng)建一個(gè)計(jì)算數(shù)字平方的函數(shù)猪腕,以便計(jì)算平方冗澈,該函數(shù)應(yīng)始終接受一個(gè)數(shù)字(本例中為整數(shù))。但是用戶不知道他/她需要提供什么樣的輸入陋葡。當(dāng)用戶輸入一個(gè)數(shù)字時(shí)亚亲,它工作得很好,但是如果用戶提供的是字符串而不是數(shù)字,會(huì)發(fā)生什么情況呢捌归。

defacceptInput():num = int(input("Please enter an integer: "))? ? print("Sqaure of the the number {} is {}".format(num, num*num))? ? acceptInput()

Please enter aninteger:5Sqaureofthe the number5is25

它拋出一個(gè)異常肛响,程序突然結(jié)束。因此惜索,為了優(yōu)雅地執(zhí)行程序特笋,我們需要處理異常。讓我們看看下面的例子-

defacceptInput():try:? ? ? ? num = int(input("Please enter an integer: "))exceptValueError:? ? ? ? print("Looks like you did not enter an integer!")? ? ? ? num = int(input("Try again-Please enter an integer: "))finally:? ? ? ? print("Finally, I executed!")? ? ? ? print("Sqaure of the the number {} is {}".format(num, num*num))? ? ? ? acceptInput()

Please enter aninteger: fiveLookslikeyou didnotenter aninteger!Tryagain-Please enter aninteger:4Finally, I executed!Sqaureofthe the number4is16

這樣巾兆,我們就可以提供邏輯并處理異常猎物。但在同一個(gè)例子中,如果用戶再次輸入字符串值角塑。那會(huì)發(fā)生什么蔫磨?

所以在這種情況下,最好在循環(huán)中輸入圃伶,直到用戶輸入一個(gè)數(shù)字堤如。

defacceptInput():whileTrue:try:? ? ? ? ? ? num = int(input("Please enter an integer: "))exceptValueError:? ? ? ? ? ? print("Looks like you did not enter an integer!")continueelse:? ? ? ? ? ? print("Yepie...you enterted integer finally so breaking out of the loop")breakprint("Sqaure of the the number {} is {}".format(num, num*num))? ? ? ? acceptInput()

Please enter aninteger: sixLookslikeyou didnotenter aninteger!Please enter aninteger: fiveLookslikeyou didnotenter aninteger!Please enter aninteger: fourLookslikeyou didnotenter aninteger!Please enter aninteger:7Yepie...you entertedintegerfinallyso breaking outoftheloopSqaureofthe the number7is49

如何處理多個(gè)異常

可以在同一個(gè)try except塊中處理多個(gè)異常。你可以有兩種方法-

在同一行中提供不同的異常窒朋。示例:ZeroDivisionError煤惩,NameError :

提供多個(gè)異常塊。當(dāng)你希望為每個(gè)異常提供單獨(dú)的異常消息時(shí)炼邀,這很有用。示例:

exceptZeroDivisionErrorase:? ? print(“Divide by zero exception occurred!, e)exceptNameErrorase:? ? print(“NameError occurred!, e)

在末尾包含?except Exception:block?總是很好的剪侮,可以捕捉到你不知道的任何不需要的異常拭宁。這是一個(gè)通用的異常捕捉命令,它將在代碼中出現(xiàn)任何類型的異常瓣俯。

# 處理多個(gè)異常defcalcdiv():x = input("Enter first number: ")? ? y = input("Enter second number: ")try:? ? ? ? result = int(x) / int(y)? ? ? ? print("Result: ", result)exceptZeroDivisionErrorase:? ? ? ? print("Divide by zero exception occured! Try Again!", e)exceptValueErrorase:? ? ? ? print("Invalid values provided! Try Again!", e)exceptExceptionase:? ? ? ? print("Something went wrong! Try Again!", e)finally:? ? ? ? print("Program ended.")calcdiv()

Enterfirstnumber:5Enter secondnumber:0Divide by zero exception occured! Try Again! division by zeroProgram ended.

如何創(chuàng)建自定義異常

有可能創(chuàng)建自己的異常杰标。你可以用raise關(guān)鍵字來(lái)做。

創(chuàng)建自定義異常的最佳方法是創(chuàng)建一個(gè)繼承默認(rèn)異常類的類彩匕。

這就是Python中的異常處理腔剂。你可以在這里查看內(nèi)置異常的完整列表:?https://docs.python.org/3.7/l...

如何處理文件

Python中的文件處理

Python使用文件對(duì)象與計(jì)算機(jī)上的外部文件進(jìn)行交互。這些文件對(duì)象可以是你計(jì)算機(jī)上的任何文件格式驼仪,即可以是音頻文件掸犬、圖像、文本文件绪爸、電子郵件湾碎、Excel文檔。你可能需要不同的庫(kù)來(lái)處理不同的文件格式奠货。

讓我們使用ipython命令創(chuàng)建一個(gè)簡(jiǎn)單的文本文件介褥,我們將了解如何在Python中讀取該文件。

%%writefiledemo_text_file.txthello worldi love ipythonjupyter notebookfourthlinefifthlinesixlineThisisthelastlinein thefileWriting demo_text_file.txt

打開文件

你可以用兩種方式打開文件

定義一個(gè)包含file對(duì)象的變量。在處理完一個(gè)文件之后柔滔,我們必須使用file對(duì)象方法close再次關(guān)閉它:

f = open("demo_text_file.txt","r")---f.close()

使用with關(guān)鍵字溢陪。不需要顯式關(guān)閉文件。

withopen(“demo_text_file.txt”, “r”):##讀取文件

在open方法中睛廊,我們必須傳遞定義文件訪問(wèn)模式的第二個(gè)參數(shù)形真。“r”是用來(lái)讀文件的喉前。類似地没酣,“w”表示寫入,“a”表示附加到文件卵迂。在下表中裕便,你可以看到更常用的文件訪問(wèn)模式。

讀取文件

在python中见咒,有多種方法可以讀取一個(gè)文件-

fileObj.read()=>將把整個(gè)文件讀入字符串偿衰。

fileObj.readline() =>將逐行讀取文件。

fileObj.readlines()=>將讀取整個(gè)文件并返回一個(gè)列表改览。小心使用此方法下翎,因?yàn)檫@將讀取整個(gè)文件,因此文件大小不應(yīng)太大宝当。

# 讀取整個(gè)文件print("------- reading entire file --------")withopen("demo_text_file.txt","r")asf:? ? print(f.read())# 逐行讀取文件print("------- reading file line by line --------")print("printing only first 2 lines")withopen("demo_text_file.txt","r")asf:? ? print(f.readline())? ? print(f.readline())# 讀取文件并以列表形式返回print("------- reading entire file as a list --------")withopen("demo_text_file.txt","r")asf:? ? print(f.readlines())# 使用for循環(huán)讀取文件print("\n------- reading file with a for loop --------")withopen("demo_text_file.txt","r")asf:forlinesinf:? ? ? ? print(lines)

------- reading entirefile--------hello worldi love ipythonjupyter notebookfourthlinefifthlinesixlineThisisthelastlinein thefile------- readingfilelinebyline--------printingonlyfirst2lineshello worldi love ipython------- reading entirefileasalist--------['hello world\n','i love ipython\n','jupyter notebook\n','fourth line\n','fifth line\n','six line\n','This is the last line in the file\n']------- readingfilewithaforloop --------hello worldi love ipythonjupyter notebookfourthlinefifthlinesixlineThisisthelastlinein thefile

寫文件

與read類似视事,python提供了以下2種寫入文件的方法。

fileObj.write()

fileObj.writelines()

withopen("demo_text_file.txt","r")asf_in:? ? withopen("demo_text_file_copy.txt","w")asf_out:f_out.write(f_in.read())

讀寫二進(jìn)制文件

你可以使用二進(jìn)制模式來(lái)讀寫任何圖像文件庆揩。二進(jìn)制包含字節(jié)格式的數(shù)據(jù)俐东,這是處理圖像的推薦方法。記住使用二進(jìn)制模式订晌,以“rb”或“wb”模式打開文件虏辫。

withopen("cat.jpg","rb")asf_in:? ? withopen("cat_copy.jpg","wb")asf_out:f_out.write(f_in.read())print("File copied...")

Filecopied...

有時(shí)當(dāng)文件太大時(shí),建議使用塊進(jìn)行讀刃獠Α(每次讀取固定字節(jié))砌庄,這樣就不會(huì)出現(xiàn)內(nèi)存不足異常∞仁啵可以為塊大小提供任何值娄昆。在下面的示例中,你將看到如何讀取塊中的文件并寫入另一個(gè)文件验辞。

### 用塊復(fù)制圖像withopen("cat.jpg","rb")asimg_in:? ? withopen("cat_copy_2.jpg","wb")asimg_out:chunk_size =4096img_chunk = img_in.read(chunk_size)whilelen(img_chunk) >0:? ? ? ? ? ? img_out.write(img_chunk)? ? ? ? ? ? img_chunk = img_in.read(chunk_size)print("File copied with chunks")

Filecopiedwithchunks

結(jié)論

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稿黄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子跌造,更是在濱河造成了極大的恐慌杆怕,老刑警劉巖族购,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陵珍,居然都是意外死亡寝杖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門互纯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瑟幕,“玉大人,你說(shuō)我怎么就攤上這事留潦≈豁铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵兔院,是天一觀的道長(zhǎng)殖卑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坊萝,這世上最難降的妖魔是什么孵稽? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮十偶,結(jié)果婚禮上菩鲜,老公的妹妹穿的比我還像新娘。我一直安慰自己惦积,他們只是感情好接校,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狮崩,像睡著了一般馅笙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厉亏,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音烈和,去河邊找鬼爱只。 笑死,一個(gè)胖子當(dāng)著我的面吹牛招刹,可吹牛的內(nèi)容都是我干的恬试。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疯暑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼训柴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起妇拯,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幻馁,失蹤者是張志新(化名)和其女友劉穎洗鸵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗嗦,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膘滨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稀拐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片火邓。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖德撬,靈堂內(nèi)的尸體忽然破棺而出铲咨,到底是詐尸還是另有隱情,我是刑警寧澤蜓洪,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布纤勒,位于F島的核電站,受9級(jí)特大地震影響蝠咆,放射性物質(zhì)發(fā)生泄漏踊东。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一刚操、第九天 我趴在偏房一處隱蔽的房頂上張望闸翅。 院中可真熱鬧,春花似錦菊霜、人聲如沸坚冀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)记某。三九已至,卻和暖如春构捡,著一層夾襖步出監(jiān)牢的瞬間液南,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工勾徽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滑凉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓喘帚,卻偏偏與公主長(zhǎng)得像畅姊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吹由,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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