python進階——4. 處理文件

4.1 字符串的語義

在python2 和 python3中,對字符串的語義是有著很大的區別的。

  • python2
    str:表面上是一個字符串,實際上是一連串的字節。
    Unicode:真正意義上的字符串
    如果存儲文件,必須將Unicode轉化成str這樣連續的字節,就是將Unicode編碼。反過來,讀取文件時需要將str解碼成Unicode。
  • python3
    byte:與py2中的str是同一含義。
    str:是真正意義上的字符串
    在讀取、寫入文本中,可以在open方法中定義具體的編解碼格式。

4.2 設置文件緩沖

在文件內容寫入到系統的設備上時,對這些文件進行I\O操作耗時可能會很長,可以使用緩沖區來減少調用時間。文件緩沖區的種類:全緩沖,行緩沖,無緩沖。
全緩沖:當寫入緩沖區的大小達到一定限制時,將緩沖區內的數據寫入到設備中,緩沖區重新開始緩沖。
行緩沖:在shell等終端設備上,使用的是行緩沖。遇到換行符進行一次輸出。
無緩沖:對一些串口來說,無需緩沖區,遇到相關信息直接輸出。

在python來說,如何設置緩沖區:
全緩沖:在open函數的buffering設置大于1的整數n,n就是緩沖區的大小;
行緩沖:在open函數的buffering設置等于1;
無緩沖:在open函數的buffering設置0;

4.3 獲取文件狀態

使用系統os庫的stat方法可以獲取文件的狀態。還有其他方法,例如lstat方法,其與stat區別是,lstat不跟隨文件鏈接。

import os

print(os.stat("D:\workspace\PythonAdvance\chapter3\join_test.py"))

os.stat_result(st_mode=33206, st_ino=1688849860425465, st_dev=217826, st_nlink=1, st_uid=0, st_gid=0, st_size=65, st_atime=1509114824, st_mtime=1509114824, st_ctime=1509114824)

其中st_mode是文件類型,可以通過導入stat模塊來解析。

import os
import stat

s = os.stat("D:\workspace\PythonAdvance\chapter3\join_test.py")
print(stat.S_ISDIR(s.st_mode))

False

獲取文件的訪問權限和可執行權限。

print(stat.S_IXUSR & s.st_mode)
print(stat.S_IRUSR & s.st_mode)

獲取文件最后訪問時間、獲取文件最后修改時間、獲取文件最后節點時間。

print(time.localtime(s.st_atime))
print(time.localtime(s.st_ctime))
print(time.localtime(s.st_mtime))

獲取文件大小

print(s.st_size)

上面介紹的都是使用os標準庫中的常規方法。其實有另外簡便的方法,就是使用os.path中封裝好的方法。

os.path中的方法

4.4 使用臨時文件

當處理一些采集上來的數據時,這些臨時文件如果常駐內存會很占用內存資源,這時,可以通過臨時文件的形式。這些臨時文件不用命名,也不用手動刪除,在關閉之后自動刪除掉。。

from tempfile import TemporaryFile, NamedTemporaryFile

f = TemporaryFile()
f.write("adb-------------------------------".encode('utf8'))
f.seek(0)
print(f.read(10))

使用TemporaryFile在文件系統中找不到所創建的臨時文件。如果要這個臨時文件創建之后能夠被找到,就使用NamedTemporaryFile來創建。

g = NamedTemporaryFile()
print(g.name)

C:\Users\HUANGG~1\AppData\Local\Temp\tmpcbe2d6_d

臨時文件在關閉之后會自動刪除掉,如果不想刪除掉,可以在構造器中加入delete=False的參數即可。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容