文件操作和異常處理

一、關(guān)于文件

  • 文件的作用:把一些數(shù)據(jù)儲(chǔ)存起來
  • 使用文件流程:
    • 打開文件,讀寫文件,關(guān)閉文件

二、讀寫文件簡(jiǎn)單操作

  • 1.讀取文件

    #打開文件
    file = open("demo1/1.txt",mode="r")
    #讀取文件
    ret = file.read()  #file只是變量,read是讀取函數(shù)
    print(ret)
    #關(guān)閉文件
    file.close()
    #第一個(gè)參數(shù)的文件的路徑
    #第二個(gè)參數(shù)mode=訪問文件的模型,r表示讀,默認(rèn)是r模式
    
  • 2.寫入文件

    2.寫文件 write
    file = open("demo1/1.txt",mode="w")
    file = open("demo1/111.txt",mode="w") #文件不存在,會(huì)自動(dòng)創(chuàng)建
    file = open("demo2/111.txt",mode="w") #不會(huì)創(chuàng)建目錄
    file.write("huangzhi")
    file.close()
    

三、文件權(quán)限

  • rb 以二進(jìn)制格式打開一個(gè)文件用于只讀。文件指針將會(huì)放在文件的開頭。一般用于 非文本文件如圖片等。
    注意:二進(jìn)制文件把內(nèi)容表示為一個(gè)特殊的 bytes 字符串類型。

    # file = open("demo1/1.txt","rb")
    file = open("demo1/1.png","rb")
    ret = file.read()  #b'huangzhi'   huangzhi
    print(ret)
    file.close()
    
  • r+ 打開一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開頭。

    file = open("demo1/1.txt","r+")
    # ret = file.read() #讀取全部?jī)?nèi)容
    # print(ret) 
    file.write("guyin") #從頭寫入,原有內(nèi)容會(huì)逐漸被覆蓋
    file.close()
    
  • rb+ 以二進(jìn)制格式打開一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開頭。一般用于 非文本文件如圖片等。

  • wb 以二進(jìn)制格式打開一個(gè)文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。一般用于非文本文件如圖片等。

    from demo1.img import img2
    file = open("demo1/2.jpg","wb")
    file.write(img2)
    file.close()
    
  • w+ 打開一個(gè)文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即 原有內(nèi)容會(huì)被刪除。如果該文件不存在,創(chuàng)建新文件。

    file = open("demo1/1.txt","w+")
    file.write("hello world")
    ret = file.read()
    print(ret)
    file.close()
    
  • a 打開一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。
    也 就是說,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件 進(jìn)行寫入。

    #在demo1下的111.txt中追加“guyin”
    # file = open("demo1/111.txt","a")
    file = open("demo1/3.txt","a")
    file.write("guyin")
    file.close()
    
  • ab 以二進(jìn)制格式打開一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文 件的結(jié)尾。也就是說,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在, 創(chuàng)建新文件進(jìn)行寫入。

  • a+ 打開一個(gè)文件用于讀寫。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。
    文 件打開時(shí)會(huì)是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。

    file = open("demo1/111.txt","a+")
    file.write("yangyong")
    ret = file.read()
    print(ret)
    file.close()
    
  • ab+ 以二進(jìn)制格式打開一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì)放在文 件的結(jié)尾。如果該文件不存在,創(chuàng)建新文件用于讀寫。

四、文件高級(jí)操作

  • 調(diào)用 read()會(huì)一次性讀取文件的全部?jī)?nèi)容,如果文件有 10G,內(nèi)存就爆了,會(huì)導(dǎo)致程序卡死,
    所以,要保險(xiǎn)起見,可以反復(fù)調(diào)用 read(size)方法,每次最多讀取 size 個(gè)字符的內(nèi)容

    file = open("demo1/111.txt","r")
    ret1 = file.read(5)
    ret2  = file.read(5)
    # print(ret1)
    print(ret2)
    file.close()
    
  • readline 每次讀取一行,并且自帶換行功能 每一行末尾會(huì)讀到\n可以指定每行讀取的字符長(zhǎng)度,下一次讀取會(huì)從此位置開始

    f = open("demo1/4.txt","r")
    # ret = f.read()
    print(f.readline(3))
    print(f.readline(3))
    print(f.readline(3))
    f.close()
    
  • readlines,一次性以行的形式讀取文件的所有內(nèi)容并返回一個(gè) list,需要去遍歷讀出來

    f = open("demo1/4.txt","r")
    ret = f.readlines()
    # print(ret)
    for i in ret:
        print(i,end='')
    f.close()
    
  • file 句柄是一個(gè)可迭代的對(duì)象因此,可以循環(huán)讀取文件中的內(nèi)容,每次讀一行

    f = open("demo1/4.txt","r")
    # print(f) #文件句柄,是一個(gè)可迭代對(duì)象
    for i in f:
        print(i)
    f.close()
    
  • write和writelines(多行一次性寫入)

    file = open("demo1/5.txt","w")
    # file.write("yangyong")
    # file.write("zhuzucheng")
    
    # lst = ["yangyong","zhuzucheng"] #列表中必須是字符串
    lst = ["yangyong","zhuzucheng",10]
    # for i in lst:
    #     file.write(i)
    file.writelines(lst)
    file.close()
    
  • cvs文件讀寫

    • 寫入 CSV 文件 必須創(chuàng)建 csv 模塊中對(duì)應(yīng)的 writer 對(duì)象,通過 writer 對(duì)象完成文件內(nèi)容的寫入操作
    f = open("demo1/movie.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["電影名稱","評(píng)分","演員","網(wǎng)址"])
    writer.writerows([["唐人際探案1","8.5","劉昊然","www.movei1.com"],
                    ["唐人際探案2","8.6","劉昊然","www.movei2.com"],
                    ["唐人際探案3","8.7","劉昊然","www.movei3.com"]])
    f.close()
    
    • 讀取 csv 文件的操作,主要通過 csv 模塊中的 reader 對(duì)象來完成,通過加載文件數(shù)據(jù)到 reader 對(duì)象中,文件中的數(shù)據(jù)就會(huì)按照固定的格式讀取到程序中進(jìn)行處理
    f = open("demo1/movie.csv","r",newline='')
    reader = csv.reader(f)
    # print(reader) #<_csv.reader object at 0x0000000001EACCE0>
    for i in reader:
        print(i)
    f.close()
    

    將豆瓣電影寫入csv文件:電影名稱,評(píng)分,演員,網(wǎng)址

    from demo1.movie import movie_dict2
    print(movie_dict2)
    for i in movie_dict2["data"]: #遍歷列表,取出字典對(duì)應(yīng)的數(shù)據(jù)
        print(i['title'],i['rate'],i['casts'],i['url'])
    
    f = open("demo1/movie2.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["電影名稱","評(píng)分","演員","網(wǎng)址"])
    for i in movie_dict2["data"]:
        movie_name = i['title']
        rate = i['rate']
        casts = i['casts']
        url = i["url"]
        writer.writerow([movie_name,rate,casts,url])
    f.close()
    

五、os模塊

import os

  • 1.重命名文件 os.rename(舊文件名,新文件名)

    重命名文件  os.rename(舊文件名,新文件名)
    os.rename("demo1/3.txt", "demo1/333.txt")
    
  • 2.刪除文件 os.remove(文件名)

    刪除文件 os.remove(文件名)
    os.remove("demo1/111.txt")
    
  • 3.創(chuàng)建目錄

    • 創(chuàng)建單層目錄 os.mkdir(目錄名)
    os.mkdir("demo2")
    
    • 創(chuàng)建多級(jí)目錄 os.makedirs(多級(jí)目錄)
  • 4.刪除目錄

    • 刪除單層目錄 os.rmdir(目錄名)
    os.rmdir("demo2")
    
    • 刪除多層目錄 os.removedirs(多級(jí)目錄)

    若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,繼續(xù)刪除,以此類推,如果上一次目錄不為空,則停止刪除文件

    os.removedirs("a/b/c/d")
    
  • 5.獲取當(dāng)前所在目錄 os.getcwd()

    print(os.getcwd())
    
  • 6.獲取目錄列表 os.listdir(path) path是路徑

    print(os.listdir(os.getcwd()))
    print(os.listdir("demo_03os模塊.py")) #必須是目錄
    print(os.listdir("a"))
    
  • 7.切換所在目錄 os.chdir(path)

    os.chdir("a")
    with open("1.txt","w") as f:
        f.write("hello")
    
  • 8.判斷文件或文件夾是否存在os.path.exists()

    print(os.path.exists("a")) #True
    print(os.path.exists("1.txt")) #False
    
  • 9.判斷是否是文件 os.path.isfile(path)

    print(os.path.isfile("a"))  #False
    print(os.path.isfile("demo_01文件基本操作.py")) #True
    
  • 10.判斷是否是目錄 os.path.isdir(path)

    print(os.path.isdir("a"))  #True
    print(os.path.isdir("demo_01文件基本操作.py")) #False
    

異常

  • 定義:異常是指在語法正確的前提下,程序運(yùn)行時(shí)報(bào)錯(cuò)就是異常

  • 當(dāng)python腳本發(fā)生異常時(shí),我們應(yīng)該捕獲它,否則程序會(huì)終止執(zhí)行

    print("hello world")
    print(1/0)
    print("代碼結(jié)束")
    
  • 異常處理 try...except

    • 程序自上往下執(zhí)行,先執(zhí)行try中的代碼,如果代碼中有異常,則不會(huì)繼續(xù)執(zhí)行try下面的代碼,會(huì)執(zhí)行except中的異常代碼
    • 如果try中沒有異常,則不會(huì)執(zhí)行except中的代碼
    try:
        print("hello")
        print(1/0)
        print("world")
    except:
        print("try中有異常代碼")
    print("代碼結(jié)束")
    #ZeroDivisionError,IndexError,NameError,TypeError,FileNotFoundError
    
  • try...except...else

    • try中代碼正常執(zhí)行結(jié)束,不會(huì)走except,走else
    • try中有異常,會(huì)走except,不走else
    try:
        print("hello")
        # print(1/0)
        print("world")
    except:
        print("出現(xiàn)異常")
    else:
        print("else中的代碼")
    print("finish")
    
  • try..except...else ...finally

    • 無論代碼是否有異常,都會(huì)走finally

      try:
          print("hello")
          # print(1/0)
          print("world")
      # except ZeroDivisionError:
      #     print("0為除數(shù)的異常")
      except NameError:
          print("命名異常")
      else:
          print("else中的代碼")
      finally:
          print("finish")
      
  • 獲取異常信息

    try:
        print("hello")
        print(1/0)
        print("world")
    # except BaseException as e:
    except Exception as e:
        print(e)
    

觸發(fā)異常

  • 用戶可以根據(jù)業(yè)務(wù)邏輯手動(dòng)拋出異常

    并且用戶可以根據(jù)需求來拋出系統(tǒng)異常和用戶的自定義異常

    try:
        name = input("請(qǐng)輸入注冊(cè)用戶名:")
        if name.isalpha():
            raise Exception("不可以全部是字母")
    except Exception as e:
        print(e)
    
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容