第十三單元 python的文件操作和異常處理

目錄 具體內(nèi)容
文件操作 1:文件操作介紹

2:文件的打開(kāi)與關(guān)閉
3:文件的讀寫
4:文件及文件夾的相關(guān)操作 |
| 異常處理 | 1:異常介紹
2:捕獲異常
3:異常的傳遞
4:拋出自定義的異常
5:異常處理中拋出異常 |

一、文件的介紹

1 :什么是文件?

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

image

2 文件的作用

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

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

思考:如果想用word編寫一份簡(jiǎn)歷,應(yīng)該有哪些流程呢?
步驟:新建--寫入數(shù)據(jù)--關(guān)閉

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

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

  • 結(jié)論
打開(kāi)文件,或者新建立一個(gè)文件
讀/寫數(shù)據(jù)
關(guān)閉文件

2.1 打開(kāi)文件

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

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

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

image

常見(jiàn)的文件操作有:寫,讀,追加

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

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

案例:以寫的方式打開(kāi)文件,寫入數(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)
案例:以讀的方式打開(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",那么可以省略,即只寫 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ù)

2.1.3 讀數(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))

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é):
(可寫)形式打開(kāi)文件,如果文件不存在則創(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é)
如果沒(méi)有文件,打開(kāi)報(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)起見(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模塊中都有這么功能

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í)行過(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 range

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

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

2 異常處理
2.1 作用
捕捉異常可以使用try/except語(yǔ)句。
try/except語(yǔ)句用來(lái)檢測(cè)try語(yǔ)句塊中的錯(cuò)誤,從而讓except語(yǔ)句捕獲異常信息并處理。
如果你不想在異常發(fā)生時(shí)結(jié)束你的程序,只需在try里捕獲它。
2.2 語(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")
       except FileNotFoundError:
       print("異常處理")
   else:
       print("沒(méi)有異常")
   try:
open("qwe.txt","r")
print("123")
   except FileNotFoundError as result:
print("異常處理",result)
   else:
       print("沒(méi)有異常")

2.3:使用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)樗东@所有的異常。

2.4:使用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) as rese:
print("出現(xiàn)異常")
else:
print("沒(méi)有異常")
2.5: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)容不同于異常

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語(yǔ)句自己觸發(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:用戶自定義異常
定義
通過(guò)創(chuàng)建一個(gè)新的異常類,程序可以命名它們自己的異常。異常應(yīng)該是典型的繼承自Exception類,通過(guò)直接或間接的方式
代碼:長(zhǎng)度不低于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: 輸入的長(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:

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

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

   import module1[, module2[,... moduleN]]
   test.py 文件代碼

   import aa
   aa.test1()
   aa.test2()
   #我是模塊1
   #我是模塊2
   導(dǎo)入python中的模塊os/math

   代碼:開(kāi)平方根
   import math
   print(math.sqrt(4))

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

5.1.2:from…import 語(yǔ)句

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

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 * 語(yǔ)句
把一個(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)單來(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.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 來(lái)調(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
    補(bǔ)充python常用模塊

作者:XiaoQu
鏈接:http://www.lxweimin.com/u/21209aff37c1
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

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

  • 目錄具體內(nèi)容文件操作1:文件操作介紹2:文件的打開(kāi)與關(guān)閉 3:文件的讀寫4:文件及文件夾的相關(guān)操作異常處理1:異...
    Anwfly閱讀 1,371評(píng)論 0 5
  • 目錄具體內(nèi)容 文件操作1:文件操作介紹 2:文件的打開(kāi)與關(guān)閉 3:文件的讀寫 4:文件及文件夾的相關(guān)操作 異常處理...
    淺色年華_7d4f閱讀 209評(píng)論 0 0
  • 一、文件的介紹 1:文件的作用 使用文件的目的:保存數(shù)據(jù)存放在磁盤把一些存儲(chǔ)存放起來(lái),可以讓程序下一次執(zhí)行的時(shí)候直...
    c_dab5閱讀 273評(píng)論 0 0
  • 目錄具體內(nèi)容 文件操作 1:文件操作介紹 2:文件的打開(kāi)與關(guān)閉 3:文件的讀寫 4:文件及文件夾的相關(guān)操作 異常處...
    遺憾與人海中閱讀 186評(píng)論 0 0
  • 一、文件的介紹 文件的作用: 使用文件的目的:保存數(shù)據(jù)存放在磁盤 把一些存儲(chǔ)存放起來(lái),可以讓程序下一次執(zhí)行的時(shí)候直...
    h枯心易涼閱讀 246評(píng)論 0 0