day-08-文件管理

文件的操作的初識

  • 利用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', '文件的改')                 # 把新文件改成原文件的名字