Python3 菜鳥教程 筆記8 -- OS、錯誤和異常

$ OS
@ OS 文件/目錄方法

OS 文件/目錄方法 Linux 命令類比
os.getcwd()  返回當前工作目錄 pwd
os.chdir(path)  改變當前工作目錄 cd
os.listdir(path)   返回path指定的文件夾包含的文件或文件夾的名字的列表 ls
os.chmod(path, mode)  更改權限 chmod
os.chown(path, uid, gid)  更改文件所有者 chown
os.rename(src, dst)  重命名文件或目錄,從 src 到 dst
os.renames(old, new)  遞歸地對目錄進行更名,也可以對文件進行更名。
參數
old -- 要重命名的目錄
new --文件或目錄的新名字。甚至可以是包含在目錄中的文件,或者完整的目錄樹
mv
os.mkdir(path[, mode])  以數字mode的mode創建一個名爲path的文件夾.默認的 mode 是 0777 (八進制)。
os.makedirs(path[, mode])  遞歸文件夾創建函數。像mkdir(), 但創建的所有intermediate-level文件夾需要包含子文件夾。
 
mkdir
os.remove(path)  刪除路徑爲path的文件。如果path 是一個文件夾,將拋出OSError; 查看下面的rmdir()刪除一個 directory。
os.removedirs(path)  遞歸刪除目錄。
os.rmdir(path)  刪除path指定的空目錄,如果目錄非空,則拋出一個OSError異常。
如果需要刪除非空目錄, 你可以使用 shutil模塊中的 rmtree函數。
rm
os.readlink(path)  返回軟鏈接所指向的文件  
os.open(file, flags[, mode])  打開一個文件,並且設置需要的打開選項,mode參數是可選的  
os.close(fd)  關閉文件描述符 fd  
os.read(fd, n)  從文件描述符 fd 中讀取最多 n 個字節,返回包含讀取字節的字符串,文件描述符 fd對應文件已達到結尾, 返回一個空字符串。  
os.write(fd, str)  寫入字符串到文件描述符 fd中. 返回實際寫入的字符串長度  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@ os.path模塊 -> 獲取文件的屬性信息 
傳送門 -> https://www.runoob.com/python3/python3-os-path.html

os.path.abspath(path)    返回絕對路徑
os.path.basename(path)    返回文件名
os.path.dirname(path)    返回文件路徑
os.path.split(path)     把路徑分割成 dirname 和 basename,返回一個元組
os.path.exists(path)    路徑存在則返回True,路徑損壞返回False
os.path.getmtime(path)    返回最近文件修改時間
os.path.getctime(path)    返回文件 path 創建時間
os.path.getsize(path)    返回文件大小,如果文件不存在就返回錯誤
os.path.isabs(path)    判斷是否爲絕對路徑
os.path.isfile(path)    判斷路徑是否爲文件
os.path.isdir(path)    判斷路徑是否爲目錄
os.path.islink(path)    判斷路徑是否爲鏈接
os.path.ismount(path)    判斷路徑是否爲掛載點
os.path.samefile(path1, path2)    判斷目錄或文件是否相同
os.path.sameopenfile(fp1, fp2)    判斷fp1和fp2是否指向同一文件

[例]注:Windows環境
>>> os.path.basename('C:\\eagle\\Friday.txt')
'Friday.txt'
>>> 
>>> os.path.dirname('C:\\eagle\\Friday.txt')
'C:\\eagle'
os.path.splitext(path)    分割路徑,返回路徑名和文件擴展名的元組
>>> 
>>> os.path.split('C:\\eagle\\Friday.txt')
('C:\\eagle', 'Friday.txt')
>>> 
>>> os.path.splitext('C:\\eagle\\Friday.txt')
('C:\\eagle\\Friday', '.txt')
>>> 
>>> os.path.exists('D:\\')
False
>>> os.path.join('opt','sw','readme.txt')
'opt\\sw\\readme.txt'
>>> 

 

$ 錯誤和異常

@ 語法錯誤(解析錯)SyntaxError

@ 異常處理
[例]讓用戶輸入一個合法的整數,但是允許用戶中斷這個程序,用戶中斷的信息會引發一個 KeyboardInterrupt 異常。
>>>while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")
        except KeyboardInterrupt:
            print("You pressed 'Ctrl+C'...Goodbye~")
            break   #這裏如果不寫break或raise就無限循環了


try語句工作方式;
執行try子句(在關鍵字try和關鍵字except之間的語句)
如果沒有異常發生,忽略except子句,try子句執行後結束。
如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的類型和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的代碼。
如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。

說明:
1.一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行。
2.一個except子句可以同時處理多個異常,這些異常將被放在一個括號裏成爲一個元組,例如:
except (RuntimeError, TypeError, NameError):
        pass
3.最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。可以使用這種方法打印一個錯誤信息,然後再次把異常拋出。
try:
    ...
except <SomeError> as err:
    ...
except <AnotherError>:
    ...
except:
    print("Unexpected error:")
    raise

4.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()

@ 拋出異常 使用raise語句,eg:raise NameError('HiThere')

@ 定義清理行爲
try語句還有另外一個可選的finally子句,它定義了無論在任何情況下都會執行的清理行爲。
[例]
>>> try:
    raise KeyboardInterrupt
finally:
    print('Goodbye, world!')

    
Goodbye, world!
Traceback (most recent call last):
  File "<pyshell#13>", line 2, in <module>
    raise KeyboardInterrupt
KeyboardInterrupt
>>>

如果一個異常在 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.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

@ 斷言 -> 用於判斷一個表達式,在表達式條件爲 false 的時候觸發異常
assert expression
等價於:
if not expression:
    raise AssertionError

assert 後面也可以緊跟參數: assert expression [, arguments]
等價於:
if not expression:
    raise AssertionError(arguments)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章