Python的文件操作和異常處理

一、文件的介紹

1:文件的作用

使用文件的目的:保存數(shù)據(jù)存放在磁盤
把一些存儲存放起來夏志,可以讓程序下一次執(zhí)行的時候直接使用乃坤,而不必重新制作一份,省時省力

二沟蔑、文件的打開與關閉

思考:如果想用word編寫一份簡歷湿诊,應該有哪些流程呢?
步驟:新建--寫入數(shù)據(jù)--關閉

打開word軟件瘦材,新建一個word文件
寫入個人簡歷信息
保存文件
關閉word軟件
同樣厅须,在操作文件的整體過程與使用word編寫一份簡歷的過程是很相似的

結論

打開文件,或者新建立一個文件
讀/寫數(shù)據(jù)
關閉文件

2.1 打開文件

在python食棕,使用open函數(shù)朗和,可以打開一個已經(jīng)存在的文件错沽,或者創(chuàng)建一個新文件open(文件名,訪問模式)

格式

f = open(‘文件’, 'w')或者f = open('文件', 'r')
r——以只讀方式打開文件例隆。文件的指針將會放在文件的開頭甥捺。這是默認模式
w——打開一個文件只用于寫入。如果該文件已存在則將其覆蓋镀层。如果該文件不存在镰禾,創(chuàng)建新文件
a——打開一個文件用于追加。如果該文件已存在唱逢,文件指針將會放在文件的結尾吴侦。也就是說,新的內(nèi)容將會被寫入到已有內(nèi)容之后坞古。如果該文件不存在备韧,創(chuàng)建新文件進行寫入
rb——以二進制格式打開一個文件只用于讀。文件指針將會放在文件的開頭痪枫。這是默認模式织堂。
wb——以二進制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋奶陈。如果該文件不存在易阳,創(chuàng)建新文件。
ab——以二進制格式打開一個文件用于追加吃粒。如果該文件已存在潦俺,文件指針將會放在文件的結尾。也就是說徐勃,新的內(nèi)容將會被寫入到已有內(nèi)容之后事示。如果該文件不存在,創(chuàng)建新文件進行寫入

常見文件操作有:寫僻肖,讀肖爵,追加

2.1.1 寫數(shù)據(jù)(write)

格式

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

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

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

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

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

總結

如果文件不存在臀脏,那么創(chuàng)建遏匆。如果存在那么就先清空,然后寫入數(shù)據(jù)

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

案例:以讀的方式打開文件谁榜,讀取數(shù)據(jù)
格式

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

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

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

總結

如果用open打開文件時幅聘,如果使用的"r",那么可以省略窃植,即只寫 open('test.txt')
如果沒有文件帝蒿,打開報錯,存在該文件才能操作
如果文件中存在中文顯示巷怜,會出現(xiàn)亂碼需要添加encoding='utf-8'
open(‘test.txt’,”r”, encoding='utf-8')

思考:如果只想讀取幾個字怎么操作?
案例:讀取指定長度的數(shù)據(jù)(單位是字節(jié))

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

注意:
使用read(num)可以從文件中讀取數(shù)據(jù)葛超,num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié))暴氏,如果沒有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)

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

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

格式

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

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

f = open('test.txt', 'r')
content = f.readlines()
print(content)
print(type(content))
2.1.4讀數(shù)據(jù)(readline)

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

格式

對象 = open("文件",r)
變量 = 對象.readline()
print(變量)
2.1.5可寫(a)

格式

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

案例侥涵,在文件中寫入數(shù)據(jù)

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

總結

(可寫)形式打開文件沼撕,如果文件不存在則創(chuàng)建并從頭添加寫入的內(nèi)容,存在則原有數(shù)據(jù)后追加數(shù)據(jù)
2.1.6讀數(shù)據(jù)(rb)

格式1

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

格式2

with open("二進制文件","rb") as 對象:
    變量 = 對象.read()
    print(變量)

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

f = open('33.jpg', 'rb')
content = f.read()
print(content)
with open("33.jpg","rb") as rf:
    res = rf.read()
    print(res)
使用習慣:格式2中不需要手動關閉文件芜飘,所以經(jīng)常被使用

總結

如果沒有文件务豺,打開報錯,存在該文件才能操作
2.1.7寫數(shù)據(jù)(wb)

格式

with open("二進制文件","wb") as 對象:
    變量 = 對象.write()
    print(變量)

案例:備份圖片

with open("1.jpg","rb") as rf:
    res = rf.read()
    with open("textjpg.jpg", "wb") as wf:
        res = wf.write(res)
    print(res)

2.2關閉文件

格式

close( )

三嗦明、文件和文件夾的操作

文件的相關操作

有些時候笼沥,需要對文件進行重命名、刪除等一些操作娶牌,python的os模塊中都有這么功能

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

格式

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

案例:

import os
os.rename("test.txt","new.txt")
3.2刪除文件
os模塊中的remove()可以完全對文件的重命名操作

格式

import os
os.remove("文件名")

案例

import os
os.rename("new.txt")

文件夾的相關操作

2.1

創(chuàng)建文件夾

os模塊中的mkdir()可以完成對文件的重命名操作
2.2獲取當前目錄
os模塊中的getcwd()可以獲取當前目錄

四奔浅、異常

1:什么是異常?

異常即是一個事件诗良,該事件會在程序執(zhí)行過程中發(fā)生乘凸,影響了程序的正常執(zhí)行。
一般情況下累榜,在Python無法正常處理程序時就會發(fā)生一個異常。
異常是Python對象灵嫌,表示一個錯誤壹罚。
當Python腳本發(fā)生異常時我們需要捕獲處理它,否則程序會終止執(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 range

str="jack"
str.index("v")                 ValueError: substring not found

c= 5/0
print(c)                #ZeroDivisionError: division by zero

2異常處理

2.1作用
捕捉異巢荩可以使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤绪穆,從而讓except語句捕獲異常信息并處理辨泳。
如果你不想在異常發(fā)生時結束你的程序,只需在try里捕獲它玖院。
2.2語法

以下為簡單的try....except...else的語法

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

代碼

try:
    open("qwe.txt","r")
    print("123")
except FileNotFoundError:
    print("異常處理")
else:
    print("沒有異常")
try:
    open("qwe.txt","r")
    print("123")
except FileNotFoundError as result:
    print("異常處理",result)
else:
    print("沒有異常")
2.3:使用except而不帶任何異常類型

你可以不帶任何異常類型使用except菠红,如下實例
語法

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

代碼

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

注意:以上方式try-except語句捕獲所有發(fā)生的異常难菌。但這不是一個很好的方式试溯,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常郊酒。

2.4:使用except而帶多種異常類型

語法

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

代碼

list = [1,2,3,4]
try:
    open("qwe.txt", "r")
    list[7]
except (NameError,FileNotFoundError) as rese:
    print("出現(xiàn)異常")
else:
    print("沒有異常")
2.5:try-finally語句
try-finally 語句無論是否發(fā)生異常都將執(zhí)行最后的代碼

語法

try:
<語句>
finally:
<語句>    #退出try時總會執(zhí)行

案例

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

注意:當在try塊中拋出一個異常键袱,立即執(zhí)行finally塊代碼。
finally塊中的所有語句執(zhí)行后摹闽,異常被再次觸發(fā)蹄咖,并執(zhí)行except塊代碼。
參數(shù)的內(nèi)容不同于異常

2.6異常的傳遞

代碼

def func1():
    print("---func1--1---")
    print(num)
    print("---func1--2---")
# def func2():
#     print("--func2--1---")
#     func1()
#     print("--func2--2---")
def func3():
    try:
        print("---func3--1---")
        func1()
        print("--func3--2----")
    except Exception as result:
        print(result)
        print("--func3---3---")
func3()
#func2()
2.7:觸發(fā)異常

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

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

def functionName( score ):
    if score < 0 or score >100:
        raise Exception("Invalid score!", score)
        # 觸發(fā)異常后付鹿,后面的代碼就不會再執(zhí)行
functionName(200)
2.8:用戶自定義異常

定義:
通過創(chuàng)建一個新的異常類澜汤,程序可以命名它們自己的異常。異常應該是典型的繼承自Exception類倘屹,通過直接或間接的方式
代碼:長度不低于3為

class ShortInputException(Exception):
    def __init__(self, length, atleast):
        self.length = length
        self.atleast = atleast
def main():
    try:
        s = input('請輸入 --> ')
        if len(s) < 3:
            # raise引發(fā)一個你定義的異常
            raise ShortInputException(len(s), 3)
    except ShortInputException as result:#x這個變量被綁定到了錯誤的實例
        print('ShortInputException: 輸入的長度是 %d,長度至少應是 %d'% (result.length, result.atleast))
    else:
        print('沒有異常發(fā)生')
main()

五银亲、模塊

Python 模塊(Module),是一個Python文件纽匙,以.py 結尾务蝠,包含了Python 對象定義和Python語句

下例是個簡單的模塊 aa.py:

def test1():
    print("我是模塊1")
def test2():
    print("我是模塊2")
5.1:import

模塊定義好后,我們可以使用 import 語句來引入模塊烛缔,語法如下

import module1[, module2[,... moduleN]]

test.py 文件代碼

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

導入python中的模塊os/math

代碼:開平方根

import math
print(math.sqrt(4))
#2
注意:一個模塊只會被導入一次馏段,不管你執(zhí)行了多少次。這樣可以防止導入模塊被一遍又一遍地執(zhí)行践瓷。
5.1.2:from...import語句

Python 的 from 語句讓你從模塊中導入一個指定的部分到當前命名空間中院喜,語法如下

from modname import name1[, name2[, ... nameN]]

test.py 文件代碼

from aa import test1
test1()
#我是模塊1

注意:只能調用導入的模塊中的部分,如果想使用test2,需要如下操作

from aa import test1,test2
test1()
test2()
#我是模塊1
#我是模塊2
5.1.3:form...impo*語句

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

from modname import *

test.py 文件代碼

from aa import *
test1()
test2()
#我是模塊1
#我是模塊2

擴展

使用__all__魔幻方法
當被引入的包中有__all__=(),里面指定的才能被調用喷舀,調用的時候使用from模塊名 import*

aa.py

__all__=('test1','test2')
def test1():
    print("我是模塊1")
def test2():
    print("我是模塊2")
def test3():
    print("我是模塊2")

test.py

from aa import *
test1()
test2()

六、Python中的包

包是一個分層次的文件目錄結構淋肾,它定義了一個由模塊及子包硫麻,和子包下的子包等組成的 Python 的應用環(huán)境。
簡單來說樊卓,包就是文件夾拿愧,但該文件夾下必須存在 init.py 文件, 該文件的內(nèi)容可以為空。init.py 用于標識當前文件夾是一個包碌尔。
考慮一個在 day 目錄下的 runoob1.py浇辜、runoob2.py、init.py 文件唾戚,test.py 為測試調用包的代碼柳洋,目錄結構如下

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

源代碼如下:
day/runoob1.py

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

day/runoob2.py

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

然后我們在 day 同級目錄下創(chuàng)建 test.py 來調用 day 包

# 導入 Phone 包
from day.runoob1 import runoob1
from day.runoob2 import runoob2
runoob1()
runoob2()

結果

I'm in runoob1
I'm in runoob2
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叹坦,隨后出現(xiàn)的幾起案子膳灶,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧钓,死亡現(xiàn)場離奇詭異序厉,居然都是意外死亡,警方通過查閱死者的電腦和手機毕箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門弛房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人而柑,你說我怎么就攤上這事文捶。” “怎么了媒咳?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵粹排,是天一觀的道長。 經(jīng)常有香客問我涩澡,道長顽耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任妙同,我火速辦了婚禮射富,結果婚禮上,老公的妹妹穿的比我還像新娘粥帚。我一直安慰自己胰耗,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布芒涡。 她就那樣靜靜地躺著柴灯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪费尽。 梳的紋絲不亂的頭發(fā)上赠群,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音依啰,去河邊找鬼。 笑死店枣,一個胖子當著我的面吹牛速警,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸯两,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼闷旧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钧唐?” 一聲冷哼從身側響起忙灼,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后该园,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酸舍,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年里初,在試婚紗的時候發(fā)現(xiàn)自己被綠了啃勉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡双妨,死狀恐怖淮阐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刁品,我是刑警寧澤泣特,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站挑随,受9級特大地震影響状您,放射性物質發(fā)生泄漏。R本人自食惡果不足惜镀裤,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一竞阐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暑劝,春花似錦骆莹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傅联,卻和暖如春先改,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒸走。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工仇奶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人比驻。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓该溯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親别惦。 傳聞我的和親對象是個殘疾皇子狈茉,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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