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
: 一般使用 utf8errors
: 報錯級別newline
: 區分換行符closefd
: 傳入的 file 引數型別opener
: 設定自定義開啟器,開啟器的返回值必須是一個開啟的檔案描述符
不同模式開啟檔案的完全列表:
模式 | 描述 |
---|---|
r |
以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是 預設模式 。 |
rb |
以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。 |
r+ |
開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
rb+ |
以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 |
w |
開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。 |
wb |
以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。 |
w+ |
開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。 |
wb+ |
以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。 |
a |
開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
ab |
以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 |
a+ |
開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。 |
ab+ |
以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。 |
模式 | 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()