2021python入門基礎語法總結(五)

2021python入門基礎語法總結(五)

2021python入門基礎語法總結(五)

16、檔案(File)

讀和寫檔案:

open() 將會返回一個 file 物件,基本語法格式如下:

open(filename, mode)

filename:包含了你要訪問的檔名稱的字串值。

mode:決定了開啟檔案的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個引數是非強制的,預設檔案訪問模式為只讀(r)。

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

模式描述

r以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。

rb以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。

r+開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。

rb+以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。

w開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。

wb以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。

w+開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。

wb+以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。

a開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。

ab以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。

a+開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。

ab+以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

簡要如下圖:

模式rr+ww+aa+

讀++ + +

寫 +++++

建立 ++++

覆蓋 ++

指標在開始++++

指標在結尾 ++

將字串“I love ranxia”寫入test。txt資料夾:

寫入字串f = open(“files/test。txt”,“w”)f。write(“I love ranxia”)f。close()#讀取檔案內容f = open(“files/test。txt”,“r”)str = f。read()print(str) #I love ranxiaf。close() #關閉檔案並釋放系統的資源

pickle 模組:

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

透過pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存。

透過pickle模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。

基本介面:

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

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

x = pickle。load(file)

註解:

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

file:

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

例項 1:

import pickle # 使用pickle模組將資料物件儲存到檔案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()

例項 2:

import pprint, pickle #使用pickle模組從檔案中重構python物件pkl_file = open(‘data。pkl’, ‘rb’) data1 = pickle。load(pkl_file)pprint。pprint(data1) data2 = pickle。load(pkl_file)pprint。pprint(data2) pkl_file。close()

常見方法:

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

序號方法及描述

1

file。close()

關閉檔案。關閉後文件不能再進行讀寫操作。

2

file。flush()

重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入。

3

file。fileno()

返回一個整型的檔案描述符(file descriptor FD 整型), 可以用在如os模組的read方法等一些底層操作上。

4

file。isatty()

如果檔案連線到一個終端裝置返回 True,否則返回 False。

5

file。next()

Python 3 中的 File 物件不支援 next() 方法。

返回檔案下一行。

6

file。read([size])

從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。

7

file。readline([size])

讀取整行,包括 “\n” 字元。

8

file。readlines([sizeint])

讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint位元組的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩衝區。

9

file。seek(offset[, whence])

設定檔案當前位置

10

file。tell()

返回檔案當前位置。

11

file。truncate([size])

從檔案的首行首字元開始截斷,截斷檔案為 size 個字元,

size 表示從當前位置截斷;截斷之後後面的所有字元被刪除,其中 Widnows 系統下的換行代表2個字元大小。

12

file。write(str)

將字串寫入檔案,返回的是寫入的字元長度。

13

file。writelines(sequence)

向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的換行符。

OS 檔案/目錄方法:

序號方法及描述

1

os。access(path, mode)

檢驗許可權模式

2

os。chdir(path)

改變當前工作目錄

3

os。chflags(path, flags)

設定路徑的標記為數字標記。

4

os。chmod(path, mode)

更改許可權

5

os。chown(path, uid, gid)

更改檔案所有者

6

os。chroot(path)

改變當前程序的根目錄

7

os。close(fd)

關閉檔案描述符 fd

8

os。closerange(fd_low, fd_high)

關閉所有檔案描述符,從 fd_low (包含) 到 fd_high (不包含), 錯誤會忽略

9

os。dup(fd)

複製檔案描述符 fd

10

os。dup2(fd, fd2)

將一個檔案描述符 fd 複製到另一個 fd2

11

os。fchdir(fd)

透過檔案描述符改變當前工作目錄

12

os。fchmod(fd, mode)

改變一個檔案的訪問許可權,該檔案由引數fd指定,引數mode是Unix下的檔案訪問許可權。

13

os。fchown(fd, uid, gid)

修改一個檔案的所有權,這個函式修改一個檔案的使用者ID和使用者組ID,該檔案由檔案描述符fd指定。

14

os。fdatasync(fd)

強制將檔案寫入磁碟,該檔案由檔案描述符fd指定,但是不強制更新檔案的狀態資訊。

15

os。fdopen(fd[, mode[, bufsize]])

透過檔案描述符 fd 建立一個檔案物件,並返回這個檔案物件

16

os。fpathconf(fd, name)

返回一個開啟的檔案的系統配置資訊。name為檢索的系統配置的值,它也許是一個定義系統值的字串,這些名字在很多標準中指定(POSIX。1, Unix 95, Unix 98, 和其它)。

17

os。fstat(fd)

返回檔案描述符fd的狀態,像stat()。

18

os。fstatvfs(fd)

返回包含檔案描述符fd的檔案的檔案系統的資訊,Python 3。3 相等於 statvfs()。

19

os。fsync(fd)

強制將檔案描述符為fd的檔案寫入硬碟。

20

os。ftruncate(fd, length)

裁剪檔案描述符fd對應的檔案, 所以它最大不能超過檔案大小。

21

os。getcwd()

返回當前工作目錄

22

os。getcwdu()

返回一個當前工作目錄的Unicode物件

23

os。isatty(fd)

如果檔案描述符fd是開啟的,同時與tty(-like)裝置相連,則返回true, 否則False。

24

os。lchflags(path, flags)

設定路徑的標記為數字標記,類似 chflags(),但是沒有軟連結

25

os。lchmod(path, mode)

修改連線檔案許可權

26

os。lchown(path, uid, gid)

更改檔案所有者,類似 chown,但是不追蹤連結。

27

os。link(src, dst)

建立硬連結,名為引數 dst,指向引數 src

28

os。listdir(path)

返回path指定的資料夾包含的檔案或資料夾的名字的列表。

29

os。lseek(fd, pos, how)

設定檔案描述符 fd當前位置為pos, how方式修改: SEEK_SET 或者 0 設定從檔案開始的計算的pos; SEEK_CUR或者 1 則從當前位置計算; os。SEEK_END或者2則從檔案尾部開始。 在unix,Windows中有效

30

os。lstat(path)

像stat(),但是沒有軟連結

31

os。major(device)

從原始的裝置號中提取裝置major號碼 (使用stat中的st_dev或者st_rdev field)。

32

os。makedev(major, minor)

以major和minor裝置號組成一個原始裝置號

33

os。makedirs(path[, mode])

遞迴資料夾建立函式。像mkdir(), 但建立的所有intermediate-level資料夾需要包含子資料夾。

34

os。minor(device)

從原始的裝置號中提取裝置minor號碼 (使用stat中的st_dev或者st_rdev field )。

35

os。mkdir(path[, mode])

以數字mode的mode建立一個名為path的資料夾。預設的 mode 是 0777 (八進位制)。

36

os。mkfifo(path[, mode])

建立命名管道,mode 為數字,預設為 0666 (八進位制)

37

os。mknod(filename[, mode=0600, device])

建立一個名為filename檔案系統節點(檔案,裝置特別檔案或者命名pipe)。

38

os。open(file, flags[, mode])

開啟一個檔案,並且設定需要的開啟選項,mode引數是可選的

39

os。openpty()

開啟一個新的偽終端對。返回 pty 和 tty的檔案描述符。

40

os。pathconf(path, name)

返回相關檔案的系統配置資訊。

41

os。pipe()

建立一個管道。 返回一對檔案描述符(r, w) 分別為讀和寫

42

os。popen(command[, mode[, bufsize]])

從一個 command 開啟一個管道

43

os。read(fd, n)

從檔案描述符 fd 中讀取最多 n 個位元組,返回包含讀取位元組的字串,檔案描述符 fd對應檔案已達到結尾, 返回一個空字串。

44

os。readlink(path)

返回軟連結所指向的檔案

45

os。remove(path)

刪除路徑為path的檔案。如果path 是一個資料夾,將丟擲OSError; 檢視下面的rmdir()刪除一個 directory。

46

os。removedirs(path)

遞迴刪除目錄。

47

os。rename(src, dst)

重新命名檔案或目錄,從 src 到 dst

48

os。renames(old, new)

遞迴地對目錄進行更名,也可以對檔案進行更名。

49

os。rmdir(path)

刪除path指定的空目錄,如果目錄非空,則丟擲一個OSError異常。

50

os。stat(path)

獲取path指定的路徑的資訊,功能等同於C API中的stat()系統呼叫。

51

os。stat_float_times([newvalue])

決定stat_result是否以float物件顯示時間戳

52

os。statvfs(path)

獲取指定路徑的檔案系統統計資訊

53

os。symlink(src, dst)

建立一個軟連結

54

os。tcgetpgrp(fd)

返回與終端fd(一個由os。open()返回的開啟的檔案描述符)關聯的程序組

55

os。tcsetpgrp(fd, pg)

設定與終端fd(一個由os。open()返回的開啟的檔案描述符)關聯的程序組為pg。

56

os。ttyname(fd)

返回一個字串,它表示與檔案描述符fd 關聯的終端裝置。如果fd 沒有與終端裝置關聯,則引發一個異常。

57

os。unlink(path)

刪除檔案路徑

58

os。utime(path, times)

返回指定的path檔案的訪問和修改的時間。

59

os。walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])

輸出在資料夾中的檔名透過在樹中游走,向上或者向下。

60

os。write(fd, str)

寫入字串到檔案描述符 fd中。 返回實際寫入的字串長度

61

os。path 模組

獲取檔案的屬性資訊。

17、錯誤與異常

即便Python程式的語法是正確的,在執行它的時候,也有可能發生錯誤。執行期檢測到的錯誤被稱為

異常,

比如除數為0,檔案找不等。

異常處理:try-except-finally

這一部分內容和JAVA的異常處理類似:

import sys try: #try是需要檢測異常的語句塊 f = open(‘myfile。txt’) s = f。readline() i = int(s。strip())except OSError as err: #捕獲異常並作出相應處理 print(“OS error: {0}”。format(err))except ValueError: print(“Could not convert data to an integer。”)except: print(“Unexpected error:”, sys。exc_info()[0]) raise

try語句按照如下方式工作;

首先,執行try子句(在關鍵字try和關鍵字except之間的語句)

如果沒有異常發生,忽略except子句,try子句執行後結束。

如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的型別和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的程式碼。

如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。

一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行。

處理程式將只針對對應的try子句中的異常進行處理,而不是其他的 try 的處理程式中的異常。

一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組,例如:

最後一個except子句可以忽略異常的名稱,它將被當作萬用字元使用。你可以使用這種方法列印一個錯誤資訊,然後再次把異常丟擲。

except (RuntimeError, TypeError, NameError): pass

try except 語句還有一個可選的else子句,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行。例如:

for arg in sys。argv[1:]: try: f = open(arg, ‘r’) except IOError: print(‘cannot open’, arg) else: print(arg, ‘has’, len(f。readlines()), ‘lines’) f。close()

使用 else 子句比把所有的語句都放在 try 子句裡面要好,這樣可以避免一些意想不到的、而except又沒有捕獲的異常。

丟擲異常:

Python 使用 raise 語句丟擲一個指定的異常。例如:

>>>raise NameError(‘HiThere’)

Traceback (most recent call last):

File “”, line 1, in ?

NameError: HiThere

raise 唯一的一個引數指定了要被丟擲的異常。它必須是一個異常的例項或者是異常的類(也就是 Exception 的子類)。

如果你只想知道這是否丟擲了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就可以再次把它丟擲。

>>>try: raise NameError(‘HiThere’) except NameError: print(‘An exception flew by!’) raise An exception flew by!Traceback (most recent call last): File “”, line 2, in ?NameError: HiThere

使用者自定義異常:

可以透過建立一個新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承,例如:

>>>class MyError(Exception): def __init__(self, value): self。value = value def __str__(self): return repr(self。value) >>> try: raise MyError(2*2) except MyError as e: print(‘My exception occurred, value:’, e。value) My exception occurred, value: 4>>> raise MyError(‘oops!’)Traceback (most recent call last): File “”, line 1, in ?__main__。MyError: ‘oops!’

在這個例子中,類 Exception 預設的 __init__() 被覆蓋。當建立一個模組有可能丟擲多種不同的異常時,一種通常的做法是為這個包建立一個基礎異常類,然後基於這個基礎類為不同的錯誤情況建立不同的子類:

class Error(Exception): “”“Base class for exceptions in this module。”“” pass class InputError(Error): “”“Exception raised for errors in the input。 Attributes: expression —— input expression in which the error occurred message —— explanation of the error ”“” def __init__(self, expression, message): self。expression = expression self。message = message class TransitionError(Error): “”“Raised when an operation attempts a state transition that‘s not allowed。 Attributes: previous —— state at beginning of transition next —— attempted new state message —— explanation of why the specific transition is not allowed ”“” def __init__(self, previous, next, message): self。previous = previous self。next = next self。message = message

注:大多數的異常的名字都以“Error”結尾,就跟標準的異常命名一樣。

定義清理行為:

try 語句還有另外一個可選的子句finally,它定義了無論在任何情況下都會執行的清理行為。 例如:

>>>try:。。。 raise KeyboardInterrupt。。。 finally:。。。 print(’Goodbye, world!‘)。。。 Goodbye, world!Traceback (most recent call last): File “”, line 2, in KeyboardInterrupt

以上例子不管 try 子句裡面有沒有發生異常,finally 子句都會執行。

如果一個異常在 try 子句裡(或者在 except 和 else 子句裡)被丟擲,而又沒有任何的 except 把它截住,那麼這個異常會在 finally 子句執行後被丟擲。

下面是一個更加複雜的例子(在同一個 try 語句裡包含 except 和 finally 子句):

>>>def divide(x, y): try: result = x / y except ZeroDivisionError: print(“division by zero!”) else: print(“result is”, result) finally: print(“executing finally clause”) >>> divide(2, 1)result is 2。0executing finally clause>>> divide(2, 0)division by zero!executing finally clause>>> divide(“2”, “1”)executing finally clauseTraceback (most recent call last): File “”, line 1, in ? File “”, line 3, in divideTypeError: unsupported operand type(s) for /: ’str‘ and ’str‘

預定義的清理行為-with語句(推薦!):

一些物件定義了標準的清理行為,無論系統是否成功的使用了它,一旦不需要它了,那麼這個標準的清理行為就會執行。

這面

這個例子展示了嘗試開啟一個檔案,然後把內容列印到螢幕上:

for line in open(“myfile。txt”): print(line, end=“”)

以上這段程式碼的問題是,當執行完畢後,檔案會保持開啟狀態,並沒有被關閉。

關鍵詞 with 語句就可以保證諸如檔案之類的物件在使用完之後一定會正確的執行他的清理方法:

with open(“myfile。txt”) as f: for line in f: print(line, end=“”)

以上這段程式碼執行完畢後,就算在處理過程中出問題了,檔案 f 總是會關閉。當操作檔案時,with獲取了應用上下文,在結束時會自動執行close函式來關閉檔案。其實可以把with看成if之類的控制語句,簡化了try-except-finally的結構。

當然,感興趣的朋友可以私我(發 1),領取python乾貨原始碼