1. 程式人生 > >檔案和目錄相關工具

檔案和目錄相關工具


概述

該部分主要包含檔案和目錄相關工具,裡面包含迭代、上下文管理、以及檔案物件對unicode編碼的支援。

一、檔案工具

open

python內建函式,用來在計算機底層系統下訪問檔案的主要工具。

基本功能

(1)被呼叫時將返回一個新的與外部相連的檔案物件。
(2)具備檔案雙向傳輸資料的方法,及執行多種檔案相關操作。
(3)為底層檔案系統提供了可移植介面,可在多種平臺上正常執行。

檔案物件模型

文字檔案

(1)內容包含unicode文字序列
(2)檔案進行雙向傳輸時,自動按照預設的編碼進行轉換,換行符自動轉換
(3)建立檔案時使用那個str物件

二進位制檔案

(1)內容包含bytes序列
(2)檔案進行雙向傳輸時,不進行任何轉換
(3)建立物件時使用bytes物件

使用內建檔案物件

read,readline     #讀取資料,注意開啟檔案的模式
write,writelines   #寫入資料,writelines列表物件輸入
close        #釋放系統資源,可使用with環境語句
seek         #移動到檔案的任意位置
flush         #快取區資料重新整理到磁碟
fileno        #獲取底層檔案控制代碼

使用檔案迭代器讀取行

檔案物件包含一個智慧的迭代器,能夠在for迴圈和列表解析等所有迭代環境下,在每次請求的情況下返回一行。

其他開啟選項

檔名
  檔案路徑可以是一個絕對路徑或相對於當前目錄的路徑
開啟模式
  r+,w+,a+ #文字模式下讀寫
  rb,wb #二進位制模式下讀寫
快取策略
  指定緩衝策略,以便提高效能,因為linux以page頁為單位,可設定open的buffer緩衝區大小減少系統IO呼叫。

文字檔案的unicode編碼

  文字檔案內容

    在檔案內部是編碼之後的形式,記憶體中則是解碼(unicode序列)之後的形式。

文字檔案的換行符轉換

  文字模式 \r\n --> \n
  文字模式 \n --> \r\n
  二進位制模式 不發生轉換,二進位制模式可以避免unicode錯誤,同時也自動禁用了換行符轉換。

python2.x和python3.x的一些區別

  python2.x中檔案會存在bytes和unicode兩種型別的資料,讀取時需要注意開啟檔案的模式。
  python3.x中檔案只存在bytes一種資料型別,讀取時可採用二進位制通用的讀取方法。

用struct打包二進位制資料

可用於打包和解壓二進位制資料,二進位制資料的內容相對來說內容比較豐富,會包含各種資料型別,如整數,浮點數,字元等。
用途:
  如果需要使用一些持久化的資料結構檔案來進行程式之間通訊的話,struct會是一種比較好的選擇,通常程式之間可採用xml這種文字格式來儲存交換資料,
  又或者採用json這種通用的序列化工具,相對來說struct在一些簡單的應用場景中,會顯得比較簡單高效些。
讀取和儲存
  讀取:採用二進位制讀取位元組字串
  儲存:採用二進位制的方式儲存位元組串
示例

import struct
file = open('data.bin', 'rb')
bytes = file.read()
values = struct.unpack('>i4shf', data)
values[3:4]
struct.unpack('>h', values)

二進位制檔案的隨機訪問

1、二進位制檔案也可以進行常見的隨機訪問處理操作,使用seek移動到檔案的任意內部位置。
2、seek支援基於位元組偏移的隨機訪問
3、文字模式下不同的編碼,會導致使用seek比較困難,這會涉及文字內容編解碼和換行符轉換問題從而導致錯誤。當檔案資料中存在unicode和非unicode

     資料共存的時候,通過seek操作之後,可能導致後續的read操作出現異常,如定位到unicode編碼位元組的中間位元組上,從而導致解碼錯誤。

os模組中的底層檔案工具
  os呼叫是通過檔案描述符來處理檔案,基於檔案描述符的檔案以原始位元組形式進行處理。
os.open的使用
  file = open('file_path', ''r)
  file.fileno()   #獲取檔案描述符

    os.open的模式識別符號
      os模組讓指令碼執行有更加精細的控制

    把描述符封裝進檔案物件
      利用os.fdopen()函式傳入檔案描述符引數,繼而操作檔案。
    其他os檔案模組工具

重新命名檔案
刪除檔案
修改檔案許可權
....

  檔案掃描器  

    可利用檔案物件的read等一系列方法來逐行讀取檔案內容,同時也可以利用for,map等迭代工具來掃描檔案。
      def scanner():
        list(map(function, open(name, 'r')))
        #[ function(line) for line in open(name, 'r') ]
    檔案過濾器
      def filter_files(name, function):
        with open(name, 'r') as input, open(name + '.out', 'w') as output:
        for line in input:
          output.write(function(line))

 

二、目錄工具

  遍歷目錄

    用os.popen執行shell命令
      #非迭代器用法,阻塞式
      os.popen('dir /b').readlines()

      #迭代器用法,非阻塞式,逐行進行讀取輸出
      for line in os.popen('dir /b'):
        print(line[:-1])

  glob模組

    該呼叫沒有涉及派生shell命令,可用於在多個目錄下收集匹配名稱。      

  遍歷目錄樹

    可以通過編寫遞迴程式來遍歷目錄樹,也可以使用os模組內建的工具,如os.walk。

  遞迴

    有條件的不斷執行自我巢狀的函式,表徵為:
    (1)包含判斷邏輯
    (2)包含迴圈處理邏輯

  python3.x中處理檔名

    通過os.listdir,os.walk等模組生成的都是unicode字串,那麼這可能會遇到解碼錯誤的問題,這時候可以
    選擇將os.listdir以bytes引數的方式指定執行,那麼函式將以編碼好的直接字串形式返回檔名。

  unicode策略:檔名和檔案內容

    與檔案相關的unicode概念有兩種完全不同的形式,檔案內容編碼和檔名編碼。
    檔案內容編碼取決於python直譯器環境的設定,檔名編碼取決於系統環境的設定。
      sys.getdefaultencoding() #檔案
      sys.getfilesystemencoding() #檔名

 

重點小結:

  1、不同型別檔案的開啟模式

  2、檔案編解碼

  3、struct模組的用法,打包和處理二進位制檔案的資料。