1. 程式人生 > 實用技巧 >Python基礎學習筆記(07)檔案操作

Python基礎學習筆記(07)檔案操作

Python基礎學習(08)

一、今日內容大綱

  • 初識檔案操作
  • 檔案操作的模式
  • 檔案操作的其他功能
  • 開啟檔案的另一種方式
  • 檔案的修改操作

二、檔案操作的初識

  1. 利用Python操作為檔案,需要的必要引數:

    • 檔案路徑:Path

    • 開啟方式:只讀、只寫、追加、寫讀、讀寫

    • 編碼方式:UTF-8、GBK、GB2312等

  2. 檔案的基本操作

    先觀察一段檔案操作的程式碼:

    f1 = open(r'D:\Python\Python Project\day08\Japanese Porn.txt',encoding= 'utf-8',mode= 'r')
    content = f1.read()
    print(content)
    f1.close()
    
    • open 是系統內建函式,open 底層呼叫的是作業系統的介面
    • f1 變數又可寫作 f1、fh、file_handler、f_h 等,譯為檔案控制代碼,Python語言中對檔案進行的任何操作,都需要通過呼叫檔案控制代碼的函式來實現。
    • encoding 引數可以省略,不寫引數會按照作業系統預設的編碼來操作
    • close 為關閉檔案控制代碼,每次開啟檔案後都需要及時關閉檔案控制代碼,否則會佔用過多記憶體。
  3. 檔案操作三部曲:

    • 開啟檔案
    • 對檔案控制代碼進行相應的操作
    • 關閉檔案控制代碼
  4. 報錯情況

    • 路徑問題:反斜槓會引起歧義
      • 解決方式一:雙反斜槓消除歧義,如:'d:\Japanese Porn.txt'
      • 解決方式二:在路徑整體前加入r,如:r'd:\Japanese Porn.txt'
    • 編碼問題:檔案儲存和開啟時用的編碼不一致
    • 檔名問題:檔名問題:檔名不可以設定成純數字,否則會無法識別

三、檔案操作的模式(mode)

  1. 檔案的讀取操作:r 模式、rb 模式、r+ 模式、r+b 模式

    首先先在 py 檔案根目錄下建立一個”檔案的讀“文字檔案和一個”美女.jpg“圖片檔案(這樣讀取時可以只需提供相對路徑),供我們讀取,其中文字檔案內容我們編輯為:

    太白金星最帥
    老男孩最好的老師
    老男孩教育是最好的學校
    dasfasfdasfsda
    asdqwedqwe
    
    • r 模式:操作的是文字檔案,會將讀取的位元組轉換成字元

      # 1.read() 
      f = open('檔案的讀', encoding='utf-8')        # mode是r可以預設不寫
      1. read() 全部都出來
      content = f.read()
      print(content)                         		# content 為字串資料型別
      f.close()
      
      # 2.read(n) 按照字元數量讀取,如reaad(n)為讀取前n個字元
      content = f.read(4)
      print(content)
      f.close()									# result: 太白金星
      
      # 3.readline() 讀一行
      line = f.readline()
      print(line)
      f.close()									# result: 太白金星最帥.
      
      # 4. readlines() 返回一個列表,列表中的每個元素是原始檔的每一行
      l1 = f.readlines()
      print(l1)
      f.close()
      # result: ['太白金星最帥\n', '老男孩最好的老師\n', '老男孩教育是最好的學校\n', 'dasfasfdasfsda\n', 'asdqwedqwe']
      
      # 5. for 讀取(佔用記憶體最低,對於大檔案最友好)
      for line in f:
          print(line)
      f.close()
      # result:
      # 太白金星最帥
      #
      # 老男孩最好的老師
      #
      # 老男孩教育是最好的學校
      #
      # dasfasfdasfsda
      #
      # asdqwedqwe
      
    • rb 模式:操作的是非文字檔案,不會將讀取的位元組轉換成字元

      f = open('美女.jfif',mode='rb')              # 帶b的模式操作檔案不需要宣告編碼方式
      content = f.read()
      print(content)
      f.close()
      # result: 
      # b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xdb\x00C\x00\x07\x05\x05\x06\x05\x04\x07\x06\x05\x06....
      
  2. 檔案的寫入操作:w 模式、wb 模式、w+ 模式、w+b 模式

    • w 模式:主要操作文字類檔案

      # 沒有檔案,建立檔案,寫入內容
      fh = open('檔案的寫', encoding='utf-8', mode='w')
      fh.write('隨便寫一點')
      fh.close()
      # 如果檔案存在,會先清空原檔案內容,再寫入新內容
      fh = open('檔案的寫', encoding='utf-8', mode='w')
      fh.write('再寫一點')
      fh.close()
      
    • wb 模式:主要操作非文字類檔案,也可操作文字類檔案

      # 為了能夠成功寫入圖片,我們參考學習讀時的圖片的機器語言
      f = open('美女.jpg',mode='rb')
      content = f.read()
      f.close()
      f1 = open('美女2.jfif', mode='wb')
      f1.write(content)
      f1.close()
      
  3. 檔案的追加操作:a 模式、ab 模式、a+ 模式、a+b 模式

    • a 模式

      # a 模式
      # 沒有檔案會建立檔案,追加內容
      f = open('檔案的追加', encoding='utf-8', mode='a')
      f.write('太白最帥。。。')
      f.close()
      # 有檔案會再後面追加
      f = open('檔案的追加', encoding='utf-8', mode='a')
      f.write('老八祕製小漢堡')
      f.close()
      
  4. 檔案的其他操作模式:

    # r+ 模式:讀和追加
    f = open('檔案的讀寫', encoding='utf=8', mode='r+')
    content = f.read()
    print(content)
    f.write('簡簡單單的晚飯')
    f.close()
    
  5. 檔案操作中的”游標“

    檔案的操作存在一個“游標”的概念,當你進行讀寫操作時,游標會隨之進行移動,如 f.read() 操作後游標會隨著讀取停止在檔案內容最後一位,此時在進行寫的操作,會從游標的位置繼續寫入。如果在r+模式下先寫後讀,游標寫入覆蓋之前的資料,且容易因為不同字元byte佔用不同情況引起亂碼,所以不能使用。

四、檔案操作的其他功能

  1. tell() 獲取游標的位置,單位為位元組

    # tell() 獲取游標的位置,單位為位元組
    f = open('檔案的讀', encoding='utf-8')    # mode是r可以預設不寫
    print(f.tell())
    f.read()
    print(f.tell())                         # content 為字串資料型別
    f.close()
    # result:
    # 0
    # 107
    
  2. seek() 調整游標的位置,單位為位元組,返回游標的位置

  3. flush() 強制重新整理,新增在寫入資料之後,可以有效儲存資料

    # flush() 強制重新整理,新增在寫入資料之後,可以有效儲存資料
    f = open('檔案的其他功能', encoding='utf-8', mode='w')
    f.write('asdasd')
    f.flush()
    f.close()
    

五、開啟檔案的另一種方式

# 優點1:不用手動關閉檔案控制代碼,會一定時間內自動關閉
with open('檔案的讀', encoding='utf-8') as f1:
    print(f1.read())
# 優點2:可以同時操作多個檔案控制代碼
with open('檔案的讀', encoding='utf-8') as f1,\
        open('檔案的寫', encoding='utf-8', mode='w') as f2:
    print(f1.read())
    f2.write('dasdas')
# 缺點:待續

六、檔案的修改操作

檔案修改的核心步驟:

  • 以讀的模式開啟原檔案
  • 以寫的模式建立一個新檔案
  • 將原檔案的內容讀出來修改成新內容,寫入新檔案
  • 將原檔案刪除
  • 將新檔案重新命名成原檔案

首先先在 建立一個”alex自述“文字檔案,供我們讀取和修改,其中文字檔案內容我們編輯為:

alex是老男孩python發起人,建立人。

alex其實是人妖。

誰說alex是sb?

你們真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。
# low 版
import os
# 1.以讀的模式開啟原檔案
# 2.以寫的模式建立一個新檔案
with open('alex自述', encoding='utf-8', mode='r') as f1,\
        open('alex自述.bak', encoding='utf-8', mode='w') as f2:
# 3.將原檔案的內容讀出來修改成新內容,寫入新檔案
    old_content = f1.read()
    new_content = old_content.replace('alex', 'SB')
    f2.write(new_content)
# 4.將原檔案刪除
os.remove('alex自述')
# 5.將新檔案重新命名成原檔案
os.rename('alex自述.bak','alex自述')


# 進階版
import os
# 1.以讀的模式開啟原檔案
# 2.以寫的模式建立一個新檔案
with open('alex自述', encoding='utf-8', mode='r') as f1,\
        open('alex自述.bak', encoding='utf-8', mode='w') as f2:
# 3.將原檔案的內容讀出來修改成新內容,寫入新檔案
    for line in f1:
        new_line = line.replace('SB','alex')
        f2.write(new_line)              # 檔案控制代碼還未關閉,所以不會重新覆蓋
# 4.將原檔案刪除
os.remove('alex自述')
# 5.將新檔案重新命名成原檔案
os.rename('alex自述.bak','alex自述')