文件操作和異常處理

一、關于文件

  • 文件的作用:把一些數據儲存起來
  • 使用文件流程:
    • 打開文件,讀寫文件,關閉文件

二、讀寫文件簡單操作

  • 1.讀取文件

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

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

三、文件權限

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

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

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

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

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

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

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

  • a+ 打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。
    文 件打開時會是追加模式。如果該文件不存在,創建新文件用于讀寫。

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

四、文件高級操作

  • 調用 read()會一次性讀取文件的全部內容,如果文件有 10G,內存就爆了,會導致程序卡死,
    所以,要保險起見,可以反復調用 read(size)方法,每次最多讀取 size 個字符的內容

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

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

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

    f = open("demo1/4.txt","r")
    # print(f) #文件句柄,是一個可迭代對象
    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 文件 必須創建 csv 模塊中對應的 writer 對象,通過 writer 對象完成文件內容的寫入操作
    f = open("demo1/movie.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["電影名稱","評分","演員","網址"])
    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 對象來完成,通過加載文件數據到 reader 對象中,文件中的數據就會按照固定的格式讀取到程序中進行處理
    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文件:電影名稱,評分,演員,網址

    from demo1.movie import movie_dict2
    print(movie_dict2)
    for i in movie_dict2["data"]: #遍歷列表,取出字典對應的數據
        print(i['title'],i['rate'],i['casts'],i['url'])
    
    f = open("demo1/movie2.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["電影名稱","評分","演員","網址"])
    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.創建目錄

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

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

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

    os.removedirs("a/b/c/d")
    
  • 5.獲取當前所在目錄 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
    

異常

  • 定義:異常是指在語法正確的前提下,程序運行時報錯就是異常

  • 當python腳本發生異常時,我們應該捕獲它,否則程序會終止執行

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

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

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

    • 無論代碼是否有異常,都會走finally

      try:
          print("hello")
          # print(1/0)
          print("world")
      # except ZeroDivisionError:
      #     print("0為除數的異常")
      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)
    

觸發異常

  • 用戶可以根據業務邏輯手動拋出異常

    并且用戶可以根據需求來拋出系統異常和用戶的自定義異常

    try:
        name = input("請輸入注冊用戶名:")
        if name.isalpha():
            raise Exception("不可以全部是字母")
    except Exception as e:
        print(e)
    
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372