2024年6月16日 Python - 檔案

流星<。)#)))≦發表於2024-06-17

File(檔案) 方法

open() 方法

open() 方法用於開啟一個檔案,並返回檔案物件,在對檔案進行處理過程都需要使用到這個函式,如果該檔案無法被開啟,會丟擲 OSError。

注意:使用 open() 方法一定要保證關閉檔案物件,即呼叫 close() 方法。

open() 函式常用形式是接收兩個引數:檔名(file)和模式(mode)。

open(file, mode='r')

完整的語法格式為:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

引數說明:

  • file : 必需,檔案路徑(相對或者絕對路徑)
  • mode : 可選,檔案開啟模式
  • buffering : 設定緩衝
  • encoding : 一般使用 utf8
  • errors : 報錯級別
  • newline : 區分換行符
  • closefd : 傳入的 file 引數型別
  • opener : 設定自定義開啟器,開啟器的返回值必須是一個開啟的檔案描述符

不同模式開啟檔案的完全列表:

模式 描述
r 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是 預設模式
rb 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。
r+ 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
rb+ 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
w 開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
wb 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
w+ 開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
wb+ 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
a 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
ab 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
a+ 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。
ab+ 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

img

模式 r r+ w w+ a a+
+ + + +
+ + + + +
建立 + + + +
覆蓋 + +
指標在開始 + + + +
指標在結尾 + +

以下例項將字串寫入到檔案 foo.txt 中:

#!/usr/bin/python3

# 開啟一個檔案
f = open("/tmp/foo.txt", "w")

f.write("Python 是一個非常好的語言。\n是的,的確非常好!!\n")

# 關閉開啟的檔案
f.close()

file 物件

file 物件使用 open 函式來建立,下表列出了 file 物件常用的函式:

方法 描述
file.close() 關閉檔案。關閉後檔案不能再進行讀寫操作。
file.flush() 重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入。
file.fileno() 返回一個整型的檔案描述符(file descriptor FD 整型), 可以用在如os模組的read方法等一些底層操作上。
file.isatty() 如果檔案連線到一個終端裝置返回 True,否則返回 False。
file.next() **Python 3 中的 File 物件不支援 next() 方法。**返回檔案下一行。
file.read([size]) 從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。
file.readline([size]) 讀取整行,包括 \n 字元。
file.readlines([sizeint]) 讀取所有行並返回列表,若給定 sizeint>0 ,返回總和大約為 sizeint 位元組的行,實際讀取值可能比 sizeint 較大, 因為需要填充緩衝區。
file.seek(offset[, whence]) 移動檔案讀取指標到指定位置
file.tell() 返回檔案當前位置。
file.truncate([size]) 從檔案的首行首字元開始截斷,截斷檔案為 size 個字元,無 size 表示從當前位置截斷;截斷之後後面的所有字元被刪除,其中 Windows 系統下的換行代表2個字元大小。
file.write(str) 將字串寫入檔案,返回的是寫入的字元長度。
file.writelines(sequence) 向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的換行符。

OS 檔案/目錄方法

os 模組提供了非常豐富的方法用來處理檔案和目錄。常用的方法如下表所示:

方法 描述
os.access(path, mode) 檢驗許可權模式
os.chdir(path) 改變當前工作目錄
os.chflags(path, flags) 設定路徑的標記為數字標記。
os.chmod(path, mode) 更改許可權
os.chown(path, uid, gid) 更改檔案所有者
os.chroot(path) 改變當前程序的根目錄
os.close(fd) 關閉檔案描述符 fd
os.closerange(fd_low, fd_high) 關閉所有檔案描述符,從 fd_low (包含) 到 fd_high (不包含), 錯誤會忽略
os.dup(fd) 複製檔案描述符 fd
os.dup2(fd, fd2) 將一個檔案描述符 fd 複製到另一個 fd2
os.fchdir(fd) 透過檔案描述符改變當前工作目錄
os.fchmod(fd, mode) 改變一個檔案的訪問許可權,該檔案由引數 fd 指定,引數 mode 是 Unix 下的檔案訪問許可權。
os.fchown(fd, uid, gid) 修改一個檔案的所有權,這個函式修改一個檔案的使用者 ID 和使用者組 ID ,該檔案由檔案描述符 fd 指定。
os.fdatasync(fd) 強制將檔案寫入磁碟,該檔案由檔案描述符 fd 指定,但是不強制更新檔案的狀態資訊。
[os.fdopen(fd, mode[, bufsize]]) 透過檔案描述符 fd 建立一個檔案物件,並返回這個檔案物件
os.fpathconf(fd, name) 返回一個開啟的檔案的系統配置資訊。name 為檢索的系統配置的值,它也許是一個定義系統值的字串,這些名字在很多標準中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
os.fstat(fd) 返回檔案描述符 fd 的狀態,像 stat()
os.fstatvfs(fd) 返回包含檔案描述符 fd 的檔案的檔案系統的資訊,Python 3.3 相等於 statvfs()
os.fsync(fd) 強制將檔案描述符為 fd 的檔案寫入硬碟。
os.ftruncate(fd, length) 裁剪檔案描述符 fd 對應的檔案, 所以它最大不能超過檔案大小。
os.getcwd() 返回當前工作目錄
os.getcwdb() 返回一個當前工作目錄的 Unicode 物件
os.isatty(fd) 如果檔案描述符 fd 是開啟的,同時與 tty(-like) 裝置相連,則返回 true , 否則 False 。
os.lchflags(path, flags) 設定路徑的標記為數字標記,類似 chflags() ,但是沒有軟連結
os.lchmod(path, mode) 修改連線檔案許可權
os.lchown(path, uid, gid) 更改檔案所有者,類似 chown ,但是不追蹤連結。
os.link(src, dst) 建立硬連結,名為引數 dst ,指向引數 src
os.listdir(path) 返回path指定的資料夾包含的檔案或資料夾的名字的列表。
os.lseek(fd, pos, how) 設定檔案描述符 fd 當前位置為 pos , how 方式修改: SEEK_SET 或者 0 設定從檔案開始的計算的 pos ; SEEK_CUR 或者 1 則從當前位置計算; os.SEEK_END 或者 2 則從檔案尾部開始。在 Unix ,Windows 中有效
os.lstat(path) stat() , 但是沒有軟連結
os.major(device) 從原始的裝置號中提取裝置 major 號碼 (使用 stat 中的 st_dev 或者 st_rdev field )。
os.makedev(major, minor) 以 major 和 minor 裝置號組成一個原始裝置號
os.makedirs(path[, mode]) 遞迴資料夾建立函式。像 mkdir() , 但建立的所有 intermediate-level 資料夾需要包含子資料夾。
os.minor(device) 從原始的裝置號中提取裝置 minor 號碼 (使用 stat 中的 st_dev 或者 st_rdev field )。
os.mkdir(path[, mode]) 以數字 mode 的 mode 建立一個名為 path 的資料夾.預設的 mode 是 0777 (八進位制)。
os.mkfifo(path[, mode]) 建立命名管道,mode 為數字,預設為 0666 (八進位制)
os.mknod(filename[, mode=0600, device]) 建立一個名為 filename 檔案系統節點(檔案,裝置特別檔案或者命名pipe)。
os.open(file, flags[, mode]) 開啟一個檔案,並且設定需要的開啟選項, mode 引數是可選的
os.openpty() 開啟一個新的偽終端對。返回 pty 和 tty 的檔案描述符。
os.pathconf(path, name) 返回相關檔案的系統配置資訊。
os.pipe() 建立一個管道。返回一對檔案描述符 (r, w) 分別為讀和寫
os.popen(command[, mode[, bufsize]]) 從一個 command 開啟一個管道
os.read(fd, n) 從檔案描述符 fd 中讀取最多 n 個位元組,返回包含讀取位元組的字串,檔案描述符 fd 對應檔案已達到結尾, 返回一個空字串。
os.readlink(path) 返回軟連結所指向的檔案
os.remove(path) 刪除路徑為 path 的檔案。如果 path 是一個資料夾,將丟擲 OSError ; 檢視下面的 rmdir() 刪除一個 directory。
os.removedirs(path) 遞迴刪除目錄。
os.rename(src, dst) 重新命名檔案或目錄,從 src 到 dst
os.renames(old, new) 遞迴地對目錄進行更名,也可以對檔案進行更名。
os.rmdir(path) 刪除path指定的空目錄,如果目錄非空,則丟擲一個 OSError 異常。
os.stat(path) 獲取path指定的路徑的資訊,功能等同於 C API 中的 stat() 系統呼叫。
os.stat_float_times([newvalue]) 決定 stat_result 是否以 float 物件顯示時間戳
os.statvfs(path) 獲取指定路徑的檔案系統統計資訊
os.symlink(src, dst) 建立一個軟連結
os.tcgetpgrp(fd) 返回與終端 fd(一個由 os.open() 返回的開啟的檔案描述符)關聯的程序組
os.tcsetpgrp(fd, pg) 設定與終端 fd(一個由 os.open() 返回的開啟的檔案描述符)關聯的程序組為 pg 。
os.ttyname(fd) 返回一個字串,它表示與檔案描述符 fd 關聯的終端裝置。如果 fd 沒有與終端裝置關聯,則引發一個異常。
os.unlink(path) 刪除檔案路徑
os.utime(path, times) 返回指定的 path 檔案的訪問和修改的時間。
os.walk(top[, topdown=True[, onerror=None[, followlinks=False\]]]) 輸出在資料夾中的檔名透過在樹中游走,向上或者向下。
os.write(fd, str) 寫入字串到檔案描述符 fd 中。返回實際寫入的字串長度
os.path 模組 獲取檔案的屬性資訊。
os.pardir() 獲取當前目錄的父目錄,以字串形式顯示目錄名。

pickle 模組

python 的 pickle 模組實現了基本的資料序列和反序列化。

基本介面:

pickle.dump(obj, file, [,protocol])

有了 pickle 這個物件,就能對 file 以讀取的形式開啟:

x = pickle.load(file)

註解:file 中讀取一個字串,並將它重構為原來的 python 物件。

file: 類檔案物件,有 read()readline() 介面。

#!/usr/bin/python3
import pickle

# 使用pickle模組將資料物件儲存到檔案
import pprint

data1 = {'a': [1, 2.0, 3, 4 + 6j], 'b': ('string', u'Unicode string'), 'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

########################################

# 使用pickle模組從檔案中重構python物件
pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)  # {'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}

data2 = pickle.load(pkl_file)
pprint.pprint(data2)  # [1, 2, 3, <Recursion on list with id=2928862444352>]

pkl_file.close()

相關文章