1. 程式人生 > 實用技巧 >檔案操作方法

檔案操作方法

溫故知新

執行python的三個步驟
      1、啟動python直譯器
      2、直譯器將test.py的內容從硬碟讀入記憶體
      3、直譯器執行剛剛讀入記憶體的程式碼,識別python語法,比如 x='上'

bytes型別

             編碼                     編碼
 字元-------------------->unicode------------->其他編碼

             解碼                      解碼
 字元<--------------------unicode<-------------其他編碼

 print(x)
 res = x.encode("gbk")
 print(type(res))>>>>>>>><class,bates>

 強調:在python3裡,只會將unicode格式的數字轉成字元,其餘編碼格式的數字均不會轉換
 print(res)
 print(res.decode("gbk"))>>>>>>>b'\xc9\xcf'

檔案處理

一、控制檔案的讀寫操作模式:

  r:只讀(預設的) 不能進行寫操作
  w:只寫---檔案存在內容則會在開啟的瞬間清空,檔案不存在就會建立一個檔案
  a:只追加寫,開啟檔案後指標會移動到檔案的末尾,不會刪除資料,只會在後面寫

二、控制檔案讀寫內容的模式

  t:控制讀寫的內容都是字串型別(預設的)
       特點:
        1、只使用與文字檔案,不適用於圖片視訊等其他格式
        2、一定要指定encoding的引數
  b:控制讀寫的記憶體都是bytes型別
        1、適用於所有型別,不過用於文字檔案較繁瑣,推薦用t模式
        2、一定不要指定encoding引數

三、呼叫開啟檔案的方法# 在檔名前面加 r 可以避免路徑中出現\n,r可以去點字元的特殊意義

        ####r: 檔案不存在則報錯,存在指標會跳到檔案的開頭進行讀取檔案
       ```
f = open(r'a.txt',mode='rt',encoding='utf-8') 
           print(f.read())
           f.close()>>>>>>回收作業系統資源

            ####w:檔案不存在會建立空文件,存在會清空內容,指標跳到開頭(切記不要用w開啟關鍵資料
           ```
       f = open(r'b.txt',mode='wt',encoding='utf-8')
                  f.write("你好啊1\n")
                  f.write("你好啊2\n")  
                  f.write("你好啊3\n")
                  f.clujinlose()     打開了

檔案不關閉的情況下,新寫入的內容永遠跟在老內容之後
####a:檔案不存建立空文件,存在會跳到末尾,在後面追加寫,比如用來存取使用者的賬戶、
```
f = open(r'c.txt',mode='at',encoding='utf-8')
檔案不管是否關閉,開啟指標都會跳到最後


           瞭解:讀寫模式(可讀可寫,很少用到)
            r+t、w+t、a+t
             例如:r+t模式
                   f = open(r'c.txt',mode='r+t',encoding='utf-8')
                   print(f.readable())
                   print(f.writable())
                    print(f.read())

                    f.write("h")
                    f.close()
####with功能 b模式
            ```
with open('1.mp4',mode='rb') as f:
            print(f.read())>>>>>>>一次性讀取所有,若是檔案過大會導致記憶體卡死,崩潰
            for line in f: >>>>>>>一行一行的讀取,不會佔用大量記憶體
                print(line)
with open('1.mp4',mode='rb')as f ,open(r'2.mp4',mode='2b')as new_f:
                  for line i f:  # 迴圈f line是讀一行
                  new_f.write(line)  #把讀到的一行 寫入new_l裡面去,一行一行讀寫,有效的節省記憶體空間
 ```
   with open('d.txt',mode='wb') as f:
            msg = "你好"
            f.write(msg.encode('utf-8'))>>>>>wb格式寫入需要編碼成utf-8 不然會亂碼

      
           ```
 with open('a.txt',mode='rt',encoding='utf-8')as f:
            res = f.read()
            print(res)>>>>>>正常讀出a.txt內文字內容
            res = f.read
            print(res)>>>>>>輸出空白,在我呢見沒有關閉是情況下,前面的f.read已經將指標移動到了末尾,所以再讀就讀不到內容了
            f.readline().......一行一行的讀取
            f.readlines()........全部讀取到一個列表中

            with open('a.txt',mode='wt',encoding='utf-8') as f:
                  lines = ['aaa\n',"bbbb\n","cccc\n"]
                        for line in lines
                             f.write(line)
              等同於 f.writelines(lines) 
                  不同的是 write.('hello) 是直接把整個字串直接寫入
                        而 writelines.('hello')是一個字母一個字母的寫入
   瞭解:
       f.flush(),因為檔案的寫入是隔一段時間寫入一次,非常急用的檔案可以用 flush()立即寫入
       print(f.close)判斷檔案是否關閉
        print(f.name) 檔案的名字

控制檔案指標的移動(被動控制指標的移動)

  ####只有在 t 模式下的read(n)代表的是字元個數(utf-8中一個英文字元一個位元組、一箇中文字元三個位元組),除此以外都是位元組個數
       ```

with open('a.txt',mode='rt',encoding = 'utf-8') as f:
res = f.read(6)
print(res) t模式.read(6)代表6個字元,所以正常輸出

        with open('a.txt',mode='rb') as f:
              res = f.read(6)
              print(res)      >>>b'hello\xe4\xbd\xa0' 會列印bytes格式
              print(res.decode('utf-8'))>>>>解碼成’utf-8'格式就可正常讀出
        
        with open('a.txt',mode='at',encoding='utf-8') as f:
              f.truncate(6)>>>>>hello�  截斷內容,若是碰到中文三個位元組,剛好截了一個或兩個位元組就會亂碼

###主動控制指標的移動
      ####f.seek(移動位元組的個數,模式)
      模式有三種:
            0:永遠參照檔案的開頭
            1:參照指標所在的當前位置
            2:永遠參照檔案末尾
      ####注意:只有0模式可以在 t 模式下使用,1 和 2 只能在b模式下使用
            ```
with open('a.txt',mode='rt',encoding='utf-8') as f:
                  f.seek(3,0) >>>參照檔案開頭,向右移動 3 個位元組
                  f.seek(5,0)
                  print(f.tell())告訴指標所在位置
            
            with open('a.txt',mode='rb')as f:
                  f.seek(-3,2)>>>>參照檔案末尾,-3 是向左移動 3 個位元組
                  print(f.tell())>>>>檔案的長度是從開頭到指標處

修改檔案的方式一、

  ####1、先將檔案的內容全部的讀入記憶體
  ####2、在記憶體中完成修改
  ####3、在修改後的內容覆蓋回原始檔
  
    ```
ps:耗費記憶體不耗費硬碟
  with open('e.txt',mode='rt',encoding='utf-8')as f:
        data = f.read()>>>>先讀到記憶體
 with open('e.txt',mode='wt',encoding='utf-8')as f1:
        f1.write(data.replace('liu','LIU') 在記憶體修改後,在覆蓋到檔案中

###修改的方式二、
      ####1、以讀的方式開啟檔案,然後以寫的方式開啟一個臨時檔案
      ####2、讀原始檔的一行內容到記憶體,然後在記憶體中修改完畢後在寫入臨時檔案
      ####3、刪除原始檔,將臨時檔案重新命名為原始檔
            
            ps:耗費硬碟不耗費記憶體
      import os 
      
      with open('e.txt',mode='rt',encoding='utf-8') as scr_f,
            open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
            for line in scr_f:
                  dst_f.write(line.replace('liu','LIU')
            一行一行的修改後存到新的資料夾,極少的佔用記憶體
        os.remove('e.txt')   >>> 刪除原始檔
        os.rename('e.txt.swp','e.txt')>>>>.修改新檔名變為原檔案