目錄 | 具體內(nèi)容 |
---|---|
文件操作 | 1:文件操作介紹 2:文件的打開與關(guān)閉 3:文件的讀寫 4:文件及文件夾的相關(guān)操作 |
異常處理 | 1:異常介紹 2:捕獲異常 3:異常的傳遞 4:拋出自定義的異常 5:異常處理中拋出異常 |
一、文件的介紹
1 :什么是文件工碾?
如下圖展示數(shù)據(jù)
2 文件的作用
使用文件的目的:保存數(shù)據(jù)存放在磁盤
把一些存儲(chǔ)存放起來,可以讓程序下一次執(zhí)行的時(shí)候直接使用百姓,而不必重新制作一份渊额,省時(shí)省力
二、文件的打開與關(guān)閉
思考:如果想用word編寫一份簡(jiǎn)歷垒拢,應(yīng)該有哪些流程呢旬迹?
步驟:新建--寫入數(shù)據(jù)--關(guān)閉
打開word軟件,新建一個(gè)word文件
寫入個(gè)人簡(jiǎn)歷信息
保存文件
關(guān)閉word軟件
同樣求类,在操作文件的整體過程與使用word編寫一份簡(jiǎn)歷的過程是很相似的
- 結(jié)論
打開文件奔垦,或者新建立一個(gè)文件
讀/寫數(shù)據(jù)
關(guān)閉文件
2.1 打開文件
在python,使用open函數(shù)尸疆,可以打開一個(gè)已經(jīng)存在的文件椿猎,或者創(chuàng)建一個(gè)新文件open(文件名,訪問模式)
格式
f = open(‘文件’, 'w')或者f = open('文件', 'r')
如下圖所示:不同的打開文件的方式
[圖片上傳失敗...(image-f848a6-1645103978670)]
image-20210117131807308.png
常見的文件操作有:寫寿弱,讀犯眠,追加
2.1.1 寫數(shù)據(jù)(write)
- 格式
對(duì)象 = open("文件",w)
對(duì)象.write("寫入數(shù)據(jù)")
對(duì)象.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()
- 總結(jié):
如果文件不存在那么創(chuàng)建症革,如果存在那么就先清空筐咧,然后寫入數(shù)據(jù)
2.1.2 讀數(shù)據(jù)(read)
- 案例:以讀的方式打開文件,讀取數(shù)據(jù)
- 格式
對(duì)象 = open("文件",r)
變量 = 對(duì)象.read()
print(變量)
- 案例:讀取文件(test.txt)
f = open('test.txt', 'r')
content = f.read()
print(content)
- 總結(jié):
如果用open打開文件時(shí)噪矛,如果使用的"r"量蕊,那么可以省略,即只寫 open('test.txt')
如果沒有文件艇挨,打開報(bào)錯(cuò)残炮,存在該文件才能操作
如果文件中存在中文顯示,會(huì)出現(xiàn)亂碼需要添加encoding='utf-8'
open(‘test.txt’,”r”, encoding='utf-8')
- 思考:如果只想讀取幾個(gè)字怎么操作?
- 案例:讀取指定長度的數(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ù)的長度(單位是字節(jié))吉殃,如果沒有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)
2.1.3 讀數(shù)據(jù)(readlines)
就像read沒有參數(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))
2.1.4 讀數(shù)據(jù)(readline)
readline可以按照行的方式把整個(gè)文件中的內(nèi)容進(jìn)行一行一行的讀取
- 格式
對(duì)象 = open("文件",r)
變量 = 對(duì)象.readline()
print(變量)
- 案例鸠删,一行一行讀取
f = open('a.txt', 'r', encoding='utf-8')
while True:
content = f.readline()
if content:
print(content)
else:
break
2.1.5 可寫(a)
- 格式
對(duì)象 = open("",a)
對(duì)象.write("寫入數(shù)據(jù)")
對(duì)象.close
- 案例抱完,在文件中寫入數(shù)據(jù)
f = open("test.txt",a)
f.write("新的數(shù)據(jù)")
對(duì)象.close
- 總結(jié):
(可寫)形式打開文件,如果文件不存在則創(chuàng)建并從頭添加寫入的內(nèi)容刃泡,存在則原有數(shù)據(jù)后追加數(shù)據(jù)
2.1.6 讀數(shù)據(jù)(rb)
- 格式1
對(duì)象 = open("二進(jìn)制文件",rb)
變量= 對(duì)象.read()
print(變量)
- 格式2
with open("二進(jìn)制文件","rb") as 對(duì)象:
變量 = 對(duì)象.read()
print(變量)
- 案例:使用盡可能多的方式實(shí)現(xiàn)讀取圖片
f = open('33.jpg', 'rb')
content = f.read()
print(content)
with open("33.jpg","rb") as rf:
res = rf.read()
print(res)
使用習(xí)慣:格式2中不需要手動(dòng)關(guān)閉文件巧娱,所以經(jīng)常被使用
- 總結(jié)
如果沒有文件碉怔,打開報(bào)錯(cuò),存在該文件才能操作
2.1.7 寫數(shù)據(jù)(wb)
- 格式
with open("二進(jìn)制文件","wb") as 對(duì)象:
變量 = 對(duì)象.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 關(guān)閉文件
- 格式
close( )
2.3 思考題
如果一個(gè)文件很大禁添,比如5G撮胧,試想應(yīng)該怎樣把文件的數(shù)據(jù)讀取到內(nèi)存然后進(jìn)行處理呢?
調(diào)用read()會(huì)一次性讀取文件的全部?jī)?nèi)容老翘,如果文件有10G芹啥,內(nèi)存就爆了,所以铺峭,要保險(xiǎ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模塊中都有這么功能
3.1 文件重命名
os模塊中的rename()可以完成對(duì)文件的重命名操作
- 格式
import os
os.rename("需要修改的文件名","新文件名")
- 案例:
import os
os.rename("test.txt","new.txt")
3.2 刪除文件
os模塊中的remove()可以完成對(duì)文件的重命名操作
- 格式
import os
os.remove("文件名")
- 案例:
import os
os.rename("new.txt")
文件夾的相關(guān)操作
2.1 創(chuàng)建文件夾
os模塊中的mkdir()可以完成對(duì)文件的重命名操作
2.2 獲取當(dāng)前目錄
os模塊中的getcwd()可以獲取當(dāng)前目錄
四卖陵、異常
1:什么是異常?
異常即是一個(gè)事件张峰,該事件會(huì)在程序執(zhí)行過程中發(fā)生泪蔫,影響了程序的正常執(zhí)行。
一般情況下喘批,在Python無法正常處理程序時(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 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語句用來檢測(cè)try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理。
如果你不想在異常發(fā)生時(shí)結(jié)束你的程序饱狂,只需在try里捕獲它曹步。
2.2 語法
以下為簡(jiǎn)單的try....except...else的語法
try:
<語句> #運(yùn)行別的代碼
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,如下實(shí)例
- 語法
try:
正常的操作
except :
發(fā)生異常休讳,執(zhí)行這塊代碼
else:
如果沒有異常執(zhí)行這塊代碼
- 代碼
try:
open("qwe.txt","r")
print("123")
except :
print("異常處理")
else:
print("沒有異常")
注意:以上方式try-except語句捕獲所有發(fā)生的異常讲婚。但這不是一個(gè)很好的方式,我們不能通過該程序識(shí)別出具體的異常信息俊柔。因?yàn)樗东@所有的異常筹麸。
2.4:使用except而帶多種異常類型
- 語法
try:
異常的操作
except(Exception1[, Exception2[,...ExceptionN]]]):
發(fā)生以上多個(gè)異常中的一個(gè),執(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時(shí)總會(huì)執(zhí)行
- 案例
try:
fh = open("test.txt", "r")
fh.readlines()
fh.close()
finally:
print("Error: 沒有找到文件或讀取文件失敗")
注意:當(dāng)在try塊中拋出一個(gè)異常婆咸,立即執(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ā)異常
- 案例:輸入考生的成績(jī)(0~100)
def functionName( score ):
if score < 0 or score >100:
raise Exception("Invalid score!", score)
# 觸發(fā)異常后侵续,后面的代碼就不會(huì)再執(zhí)行
functionName(200)
2.8:用戶自定義異常
- 定義
通過創(chuàng)建一個(gè)新的異常類倔丈,程序可以命名它們自己的異常。異常應(yīng)該是典型的繼承自Exception類状蜗,通過直接或間接的方式 - 代碼:長度不低于3為
class ShortInputException(Exception):
def __init__(self, length, atleast):
self.length = length
self.atleast = atleast
def main():
try:
s = input('請(qǐng)輸入 --> ')
if len(s) < 3:
# raise引發(fā)一個(gè)你定義的異常
raise ShortInputException(len(s), 3)
except ShortInputException as result:#x這個(gè)變量被綁定到了錯(cuò)誤的實(shí)例
print('ShortInputException: 輸入的長度是 %d,長度至少應(yīng)是 %d'% (result.length, result.atleast))
else:
print('沒有異常發(fā)生')
main()
五需五、模塊
Python 模塊(Module),是一個(gè)Python文件轧坎,以.py 結(jié)尾宏邮,包含了Python 對(duì)象定義和Python語句
- 下例是個(gè)簡(jiǎn)單的模塊 aa.py:
def test1():
print("我是模塊1")
def test2():
print("我是模塊2")
5.1:模塊的引入
5.1.1:import
模塊定義好后,我們可以使用 import 語句來引入模塊缸血,語法如下
import module1[, module2[,... moduleN]]
test.py 文件代碼
import aa
aa.test1()
aa.test2()
#我是模塊1
#我是模塊2
導(dǎo)入python中的模塊os/math
- 代碼:開平方根
import math
print(math.sqrt(4))
#2
注意:一個(gè)模塊只會(huì)被導(dǎo)入一次,不管你執(zhí)行了多少次。這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行舵匾。
5.1.2:from…import 語句
Python 的 from 語句讓你從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中诡曙,語法如下
from modname import name1[, name2[, ... nameN]]
test.py 文件代碼
from aa import test1
test1()
#我是模塊1
注意:只能調(diào)用導(dǎo)入的模塊中的部分,如果想使用test2,需要如下操作
from aa import test1,test2
test1()
test2()
#我是模塊1
#我是模塊2
- 思考:如果需要導(dǎo)入模塊中的部分有很多笆豁,怎么操作?
5.1.3:from…import * 語句
把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的郎汪,只需使用如下聲明:
from modname import *
test.py 文件代碼
from aa import *
test1()
test2()
#我是模塊1
#我是模塊2
- 擴(kuò)展
使用__all__魔幻方法
當(dāng)被引入的包中有__all__=(),里面指定的才能被調(diào)用,調(diào)用的時(shí)候使用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中的包
包是一個(gè)分層次的文件目錄結(jié)構(gòu)煞赢,它定義了一個(gè)由模塊及子包,和子包下的子包等組成的 Python 的應(yīng)用環(huán)境哄孤。
簡(jiǎn)單來說耕驰,包就是文件夾,但該文件夾下必須存在 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.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"
然后我們?cè)?day 同級(jí)目錄下創(chuàng)建 test.py 來調(diào)用 day 包
# 導(dǎo)入 Phone 包
from day.runoob1 import runoob1
from day.runoob2 import runoob2
runoob1()
runoob2()
- 結(jié)果
I'm in runoob1
I'm in runoob2