day-08-檔案管理

先生發表於2021-04-11

檔案的操作的初識

  • 利用python程式碼寫一個很low的軟體,去操作檔案。

    • 檔案路徑:path

    • 開啟方式:讀,寫,追加,讀寫,寫讀......

    • 編碼方式:utf-8,gbk ,gb2312......

    f1 = open('d:\聯絡方式.txt', encoding='utf-8', mode='r')
    content = f1.read()
    print(content)
    # 輸出:
    練習方式:123456
    • open:內建函式,open底層呼叫的是作業系統的藉口。

    • f1是變數,也叫檔案控制程式碼。對檔案進行的任何操作,都得通過檔案控制程式碼。

    • encoding:可以不寫,不寫引數,預設的編碼本:作業系統預設的編碼

      • Windows:gbk

      • Linux:utf-8

      • mac:utf-8

    • f1.close():關閉檔案控制程式碼,不然會一直佔用記憶體。

  • 檔案操作三部曲

    • 開啟檔案

    • 對檔案控制程式碼進行相應的操作

    • 關閉檔案

  • 報錯原因:

    • UnicodeDecodeError:檔案儲存時與檔案開啟時編碼運用不一致。

    • 第二個錯誤:路徑分隔符產生的問題:加個 r

      r'C:\Users\YS\Desktop\聯絡方式.txt'

檔案操作的讀

(1)r 模式:讀取得資料型別是 str ,操作的是文字檔案
  • read(n) :讀幾個字元 ,n不寫預設全讀

    f = open('檔案的讀.txt',encoding='utf-8')
    content = f.read(5)
    print(content)
    f.close()
    # 輸出
    讀讀讀讀
  • readline():讀幾行,寫幾遍,讀幾行

    f = open('檔案的讀.txt',encoding='utf-8')
    print(f.readline())
    print(f.readline())
    print(f.readline())
    f.close()
    # 輸出
    讀讀讀讀
    aaaa
    ABCD

     

  • readlines():返回一個列表,列表中的每個元素是原始檔的每一行。

    f = open('檔案的讀.txt',encoding='utf-8')
    content = f.readlines()
    print(content)
    f.close()
    # 輸出
    ['讀讀讀讀\n', 'aaaa\n', 'ABCD\n', '!@#¥']

     

  • for 讀取,和 for 迴圈 readlines 一樣的輸出效果

    但是 for 讀取始終佔用一行的記憶體,對於大資料的讀取 readlines 因為他會生成一個字典,會一下把記憶體給佔滿(幾十個G的資料)

    f = open('檔案的讀.txt',encoding='utf-8')
    for lin in f:
        print(lin)
    f.close()
    # 輸出
    讀讀讀讀
    aaaa
    ABCD
    !@#¥模式

     

(2)rb模式:
  • 操作的是非文字的檔案,圖片,視訊,音訊。rb 模式讀取的資料型別為 bytes

  • 讀取方式和 r 是樣的read(),readline(),readlines(),for

    f = open('LOL.png',mode='rb')
    conten = f.read()   # 方式和 r 模式是一樣的
    print(conten)
    f.close()
    # 輸出的是bytes資料格式
    b'\x89PNG\r\n\x1a\n........'

     

檔案操作的寫

(1)w 模式:
  • 有關寫(w)的清空的問題:關閉檔案控制程式碼,再次以 w 模式開啟此檔案時才會清空

  • write()

    # 沒有檔案,建立檔案,寫入內容,在當前目錄下。
    f = open('檔案的寫', encoding='utf-8', mode='w') # ’檔案的寫‘為檔名
    conten = f.write('隨便寫一點。。。')
    f.close()
    ​
    # 如果檔案存在,先清空原檔案內容,在寫入新內容
    f = open('檔案的寫', encoding='utf-8', mode='w')
    conten = f.write('多寫一點。。。')
    f.close()

     

(2)wb 模式,操作非文字檔案
f = open('LOL.jpg', mode='rb')
content = f.read()   # 先獲取一個bytes格式的資料
f.close()
​
# 沒有檔案,建立檔案,寫入內容 寫入資料格式為bytes(非Unicode編碼)在當前目錄下
f1 = open('LOL2.jpg', mode='wb')
content1 = f1.write(content)
f1.close()

 

檔案操作的追加

(1)a 模式
# 沒有檔案建立檔案,追加內容,有檔案就直接在原檔案的最後面追加。
f = open('檔案的追加', encoding='utf-8', mode='a')
content = f.write('追加一點。。。。')
f.close()

 

檔案操作的其他模式

(1)r+ 模式:檔案的讀和寫,先讀後寫,讀一個游標往後移一個,寫在最後面游標所在的位置,(讀並追加)
# 讀並追加 順序不能錯,不能建立
f = open('檔案的讀寫',encoding='utf-8',mode='r+')
content = f.read()   # 先讀
print(content)
f.write('隨便寫一點。。。')   # 後追加

 

檔案操作的其他功能

  • 總結:

    • 三個大方向:

      • 讀,四種模式: r rb r+ r+b

      • 寫,四種模式: w wb w+ w+b

      • 追加:四種模式:a ab a+ a+b

      相應的功能:對檔案控制程式碼的操作:read,raed(n),readline(),readlines(),write()

    • tell():方法獲取游標的位置,單位是位元組。

      f = open('檔案的讀寫', encoding='utf-8')
      print(f.tell())         # 獲取讀之前游標所在的位置為 0
      content = f.read()      # 讀,讀一個字元游標往後移一個字元
      print(f.tell())         # 獲取讀之後游標所在的位置為 30
      print(content)
      # 輸出
      0
      30
      隨便寫一點點點點點點

       

    • seek():調整游標的位置

      f = open('檔案的讀寫',encoding='utf-8')
      f.seek(6)               # 把游標的位置調整到第6個位元組
      print(f.tell())         # 獲取游標的位置為為6
      content = f.read()      # 從游標調整的位置開始讀:寫一點點點點點點
      print(f.tell())         # 獲取游標讀之後的位置為30
      # 輸出
      6
      30
      寫一點點點點點點

       

    • flush:強制重新整理,相當於儲存。

      f = open('檔案的讀寫', encoding='utf-8', mode='w')
      content = f.write('追加一點。。。。')
      f.flush()           # 儲存一下,Python會自動儲存,有些不會
      f.close()           # 退出

       

開啟檔案的另一種方式

  • with open():

    • 優點1:不用手動關閉檔案控制程式碼,會在一定時間關閉

    • 優點2:可以一個語句操作多個檔案控制程式碼,一個with可以操作多個open

      with open('檔案的讀', encoding='utf-8') as f1, \  
           open('檔案的追加', encoding='utf-8', mode='a') as f2:
          print(f1.read())
          print(f2.write('追加一點。。'))

       

      \代表這一行程式碼沒有完從下一行開始

檔案操作的改

  • 現存所有的軟體對檔案修改都是經歷這五步(底層)

    1. 以讀的模式開啟原檔案

    2. 以寫的模式建立一個新檔案。

    3. 將原檔案的內容讀出來修改成新內容,寫入新檔案。

    4. 將原檔案刪除。記憶體級別

    5. 將新檔案重新命名成原檔案

  • low版的,因為用的是 read() 只針對小的檔案,大的檔案 read() 讀的時候就會把記憶體佔滿(一次全讀)

    import os
    with open('檔案的改', encoding='utf-8') as f1, \  # 讀取要讀取的檔案
         open('檔案的改.txt', encoding='utf-8', mode='w') as f2:  # 新建一個新檔案
        low = f1.read()                                         # 讀取
        content_low = low.replace('Python', 'PHP')              # 修改讀取的檔案內容
        content_new = f2.write(content_low)                     # 修改後寫入新檔案
    os.remove('檔案的改')                                        # 刪除原檔案
    os.rename('檔案的改.txt', '檔案的改')                        # 把新檔案改成原檔案的名字

     

  • 進階版。for 每次迴圈讀取每一行的值,只佔用當前一行的記憶體,佔用資源少。

    import os
    with open('檔案的改', encoding='utf-8') as f1, \   # 讀取要改的檔案
            open('檔案的改.txt', encoding='utf-8', mode='w') as f2:  # 新建一個檔案
        for low in f1:                                  # for 迴圈讀取要改檔案的每一行
            content_new = low.replace('Python', 'PHP')  # 每迴圈一行修改一行
            f2.write(content_new)                       # 修改後的每一寫入新檔案
    os.remove('檔案的改')                                # 刪除原檔案
    os.rename('檔案的改.txt', '檔案的改')                 # 把新檔案改成原檔案的名字