檔案和目錄相關工具
概述
該部分主要包含檔案和目錄相關工具,裡面包含迭代、上下文管理、以及檔案物件對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模組的用法,打包和處理二進位制檔案的資料。