九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
第26天:Python os 模塊詳解

1. 簡(jiǎn)介

os就是“operating system”的縮寫,顧名思義,os模塊提供的就是各種 Python 程序與操作系統(tǒng)進(jìn)行交互的接口。通過(guò)使用os模塊,一方面可以方便地與操作系統(tǒng)進(jìn)行交互,另一方面頁(yè)也可以極大增強(qiáng)代碼的可移植性。如果該模塊中相關(guān)功能出錯(cuò),會(huì)拋出OSError異?;蚱渥宇惍惓!?/p>

注意,如果是讀寫文件的話,建議使用內(nèi)置函數(shù)open();如果是路徑相關(guān)的操作,建議使用os的子模塊os.path;如果要逐行讀取多個(gè)文件,建議使用fileinput模塊;要?jiǎng)?chuàng)建臨時(shí)文件或路徑,建議使用tempfile模塊;要進(jìn)行更高級(jí)的文件和路徑操作則應(yīng)當(dāng)使用shutil模塊。

當(dāng)然,使用os模塊可以寫出操作系統(tǒng)無(wú)關(guān)的代碼并不意味著os無(wú)法調(diào)用一些特定系統(tǒng)的擴(kuò)展功能,但要切記一點(diǎn):一旦這樣做就會(huì)極大損害代碼的可移植性

此外,導(dǎo)入os模塊時(shí)還要小心一點(diǎn),千萬(wàn)不要為了圖調(diào)用省事兒而將os模塊解包導(dǎo)入,即不要使用from os import *來(lái)導(dǎo)入os模塊;否則os.open()將會(huì)覆蓋內(nèi)置函數(shù)open(),從而造成預(yù)料之外的錯(cuò)誤。

2. 常用功能

注意,os模塊中大多數(shù)接受路徑作為參數(shù)的函數(shù)也可以接受“文件描述符”作為參數(shù)。

文件描述符:file descriptor,在 Python 文檔中簡(jiǎn)記為 fd,是一個(gè)與某個(gè)打開的文件對(duì)象綁定的整數(shù),可以理解為該文件在系統(tǒng)中的編號(hào)。

2.1 os.name

該屬性寬泛地指明了當(dāng)前 Python 運(yùn)行所在的環(huán)境,實(shí)際上是導(dǎo)入的操作系統(tǒng)相關(guān)模塊的名稱。這個(gè)名稱也決定了模塊中哪些功能是可用的,哪些是沒有相應(yīng)實(shí)現(xiàn)的。

目前有效名稱為以下三個(gè):posix,nt,java。

其中posix是 Portable Operating System Interface of UNIX(可移植操作系統(tǒng)接口)的縮寫。Linux 和 Mac OS 均會(huì)返回該值;nt全稱應(yīng)為“Microsoft Windows NT”,大體可以等同于 Windows 操作系統(tǒng),因此 Windows 環(huán)境下會(huì)返回該值;java則是 Java 虛擬機(jī)環(huán)境下的返回值。

因此在我的電腦(win10)上執(zhí)行下述代碼,返回值是nt

>>> import os>>> os.name'nt'

而在 WSL(Windows Subsystem Linux,Windows 下的 Linux 子系統(tǒng))上的結(jié)果則是:

>>> import os>>> os.name'posix'

查看sys模塊中的sys.platform屬性可以得到關(guān)于運(yùn)行平臺(tái)更詳細(xì)的信息,在此不再贅述

2.2 os.environ

os.environ屬性可以返回環(huán)境相關(guān)的信息,主要是各類環(huán)境變量。返回值是一個(gè)映射(類似字典類型),具體的值為第一次導(dǎo)入os模塊時(shí)的快照;其中的各個(gè)鍵值對(duì),鍵是環(huán)境變量名,值則是環(huán)境變量對(duì)應(yīng)的值。在第一次導(dǎo)入os模塊之后,除非直接修改os.environ的值,否則該屬性的值不再發(fā)生變化。

比如其中鍵為“HOMEPATH”(Windows 下,Linux 下為“HOME”)的項(xiàng),對(duì)應(yīng)的值就是用戶主目錄的路徑。Windows 下,其值為:

>>> os.environ["HOMEPATH"]'d:\\justdopython'

Linux 下,其值為:

>>> os.environ["HOME"]'/home/justdopython'

2.3 os.walk()

這個(gè)函數(shù)需要傳入一個(gè)路徑作為top參數(shù),函數(shù)的作用是在以top為根節(jié)點(diǎn)的目錄樹中游走,對(duì)樹中的每個(gè)目錄生成一個(gè)由(dirpath, dirnames, filenames)三項(xiàng)組成的三元組。

其中,dirpath是一個(gè)指示這個(gè)目錄路徑的字符串,dirnames是一個(gè)dirpath下子目錄名(除去“.”“..”)組成的列表,filenames則是由dirpath下所有非目錄的文件名組成的列表。要注意的是,這些名稱并不包含所在路徑本身,要獲取dirpath下某個(gè)文件或路徑從top目錄開始的完整路徑,需要使用os.path.join(dirpath, name)。

注意最終返回的結(jié)果是一個(gè)迭代器,我們可以使用for語(yǔ)句逐個(gè)取得迭代器的每一項(xiàng):

>>> for item in os.walk("."):... print(item)...('.', ['do'], ['go_go_go.txt'])('.\\do', ['IAmDirectory', 'python'], [])('.\\do\\IAmDirectory', [], [])('.\\do\\python', [], ['hello_justdopython.txt'])

目錄樹結(jié)構(gòu)

2.4 os.listdir()

“l(fā)istdir”即“l(fā)ist directories”,列出(當(dāng)前)目錄下的全部路徑(及文件)。該函數(shù)存在一個(gè)參數(shù),用以指定要列出子目錄的路徑,默認(rèn)為“.”,即“當(dāng)前路徑”。

函數(shù)返回值是一個(gè)列表,其中各元素均為字符串,分別是各路徑名和文件名。

通常在需要遍歷某個(gè)文件夾中文件的場(chǎng)景下極為實(shí)用。

比如定義以下函數(shù):

def get_filelists(file_dir='.'): list_directory = os.listdir(file_dir) filelists = [] for directory in list_directory: # os.path 模塊稍后會(huì)講到 if(os.path.isfile(directory)): filelists.append(directory) return filelists

該函數(shù)的返回值就是當(dāng)前目錄下所有文件而非文件夾的名稱列表。

2.5 os.mkdir()

“mkdir”,即“make directory”,用處是“新建一個(gè)路徑”。需要傳入一個(gè)類路徑參數(shù)用以指定新建路徑的位置和名稱,如果指定路徑已存在,則會(huì)拋出FileExistsError異常。

該函數(shù)只能在已有的路徑下新建一級(jí)路徑,否則(即新建多級(jí)路徑)會(huì)拋出FileNotFoundError異常。

相應(yīng)地,在需要新建多級(jí)路徑的場(chǎng)景下,可以使用os.makedirs()來(lái)完成任務(wù)。函數(shù)os.makedirs()執(zhí)行的是遞歸創(chuàng)建,若有必要,會(huì)分別新建指定路徑經(jīng)過(guò)的中間路徑,直到最后創(chuàng)建出末端的“葉子路徑”。

示例如下:

>>> os.mkdir("test_os_mkdir")>>> os.mkdir("test_os_mkdir")Traceback (most recent call last): File "<stdin>", line 1, in <module>FileExistsError: [WinError 183] 當(dāng)文件已存在時(shí),無(wú)法創(chuàng)建該文件。: 'test_os_mkdir'>>> >>> os.mkdir("test_os_mkdir/test_os_makedirs/just/do/python/hello")Traceback (most recent call last): File "<stdin>", line 1, in <module>FileNotFoundError: [WinError 3] 系統(tǒng)找不到指定的路徑。: 'test_os_mkdir/test_os_makedirs/just/do/python/hello'>>> >>> os.makedirs("test_os_mkdir/test_os_makedirs/just/do/python/hello")

2.6 os.remove()

用于刪除文件,如果指定路徑是目錄而非文件的話,就會(huì)拋出IsADirectoryError異常。刪除目錄應(yīng)該使用os.rmdir()函數(shù)。

同樣的,對(duì)應(yīng)于os.makedirs(),刪除路徑操作os.rmdir()也有一個(gè)遞歸刪除的函數(shù)os.removedirs(),該函數(shù)會(huì)嘗試從最下級(jí)目錄開始,逐級(jí)刪除指定的路徑,幾乎就是一個(gè)os.makedirs()的逆過(guò)程;一旦遇到非空目錄即停止。

2.7 os.rename()

該函數(shù)的作用是將文件或路徑重命名,一般調(diào)用格式為os.rename(src, dst),即將src指向的文件或路徑重命名為dst指定的名稱。

注意,如果指定的目標(biāo)路徑在其他目錄下,該函數(shù)還可實(shí)現(xiàn)文件或路徑的“剪切并粘貼”功能。但無(wú)論直接原地重命名還是“剪切粘貼”,中間路徑都必須要存在,否則就會(huì)拋出FileNotFoundError異常。如果目標(biāo)路徑已存在,Windows 下會(huì)拋出FileExistsError異常;Linux 下,如果目標(biāo)路徑為空且用戶權(quán)限允許,則會(huì)靜默覆蓋原路徑,否則拋出OSError異常,

和上兩個(gè)函數(shù)一樣,該函數(shù)也有對(duì)應(yīng)的遞歸版本os.renames(),能夠創(chuàng)建缺失的中間路徑。

注意,這兩種情況下,如果函數(shù)執(zhí)行成功,都會(huì)調(diào)用os.removedir()函數(shù)來(lái)遞歸刪除源路徑的最下級(jí)目錄。

2.8 os.getcwd()

“getcwd”實(shí)際上是“get the current working directory”的簡(jiǎn)寫,顧名思義,也就是說(shuō)這個(gè)函數(shù)的作用是“獲取當(dāng)前工作路徑”。在程序運(yùn)行的過(guò)程中,無(wú)論物理上程序在實(shí)際存儲(chǔ)空間的什么地方,“當(dāng)前工作路徑”即可認(rèn)為是程序所在路徑;與之相關(guān)的“相對(duì)路徑”、“同目錄下模塊導(dǎo)入”等相關(guān)的操作均以“當(dāng)前工作路徑”為準(zhǔn)。

在交互式環(huán)境中,返回的就是交互終端打開的位置;而在 Python 文件中,返回的則是文件所在的位置。

在 Windows 下會(huì)有如下輸出:

>>> os.getcwd()'d:\\justdopython\\just\\do\\python'

Linux 下的輸出則是:

>>> os.getcwd()'/home/justdopython/just/do/python'

2.9 os.chdir()

“chdir”其實(shí)是“change the directory”的簡(jiǎn)寫,因此os.chdir()的用處實(shí)際上是切換當(dāng)前工作路徑為指定路徑。其中“指定路徑”需要作為參數(shù)傳入函數(shù)os.chdir(),該參數(shù)既可以是文本或字節(jié)型字符串,也可以是一個(gè)文件描述符,還可以是一個(gè)廣義的類路徑(path-like)對(duì)象。若指定路徑不存在,則會(huì)拋出FileNotFoundError異常。

在 Windows 下,調(diào)用該函數(shù)的效果為:

>>> os.chdir("d:/justdopython/just/do")>>> os.getcwd()'d:\\justdopython\\just\\do'

在 Linux 下的效果則是:

>>> os.chdir("/home/justdopython/just/do") # 也可將參數(shù)指定為"..",即可切換到父目錄>>> os.getcwd()'/home/justdopython/just/do'

有了這個(gè)函數(shù),跨目錄讀寫文件和調(diào)用模塊就會(huì)變得非常方便了,很多時(shí)候也就不必再反復(fù)將同一個(gè)文件在各個(gè)目錄之間復(fù)制粘貼運(yùn)行,腳本完全可以坐鎮(zhèn)中軍,在一個(gè)目錄下完成對(duì)其他目錄文件的操作,正所謂“運(yùn)籌帷幄之中,決勝于千里之外”也。

舉例來(lái)說(shuō),可以通過(guò)將“當(dāng)前工作目錄”切換到父目錄,從而直接訪問(wèn)父目錄的文件內(nèi)容:

>>> os.chdir("..")>>> os.getcwd()'D:\\justdopython\\just'>>> with open("hello_justdopython.txt", encoding="utf-8") as f:... f.read()...'歡迎訪問(wèn) justdopython.com,一起學(xué)習(xí) Python 技術(shù)~'>>> os.listdir()['hello_justdopython.txt']

3. os.path 模塊

其實(shí)這個(gè)模塊是os模塊根據(jù)系統(tǒng)類型從另一個(gè)模塊導(dǎo)入的,并非直接由os模塊實(shí)現(xiàn),比如os.name值為nt,則在os模塊中執(zhí)行import ntpath as path;如果os.name值為posix,則導(dǎo)入posixpath

使用該模塊要注意一個(gè)很重要的特性:os.path中的函數(shù)基本上是純粹的字符串操作。換句話說(shuō),傳入該模塊函數(shù)的參數(shù)甚至不需要是一個(gè)有效路徑,該模塊也不會(huì)試圖訪問(wèn)這個(gè)路徑,而僅僅是按照“路徑”的通用格式對(duì)字符串進(jìn)行處理。

更進(jìn)一步地說(shuō),os.path模塊的功能我們都可以自己使用字符串操作手動(dòng)實(shí)現(xiàn),該模塊的作用是讓我們?cè)趯?shí)現(xiàn)相同功能的時(shí)候不必考慮具體的系統(tǒng),尤其是不需要過(guò)多關(guān)注文件系統(tǒng)分隔符的問(wèn)題。

3.1 os.path.join()

這是一個(gè)十分實(shí)用的函數(shù),可以將多個(gè)傳入路徑組合為一個(gè)路徑。實(shí)際上是將傳入的幾個(gè)字符串用系統(tǒng)的分隔符連接起來(lái),組合成一個(gè)新的字符串,所以一般的用法是將第一個(gè)參數(shù)作為父目錄,之后每一個(gè)參數(shù)即是下一級(jí)目錄,從而組合成一個(gè)新的符合邏輯的路徑。

但如果傳入路徑中存在一個(gè)“絕對(duì)路徑”格式的字符串,且這個(gè)字符串不是函數(shù)的第一個(gè)參數(shù),那么其他在這個(gè)參數(shù)之前的所有參數(shù)都會(huì)被丟棄,余下的參數(shù)再進(jìn)行組合。更準(zhǔn)確地說(shuō),只有最后一個(gè)“絕對(duì)路徑”及其之后的參數(shù)才會(huì)體現(xiàn)在返回結(jié)果中。

>>> os.path.join("just", "do", "python", "dot", "com")'just\\do\\python\\dot\\com'>>> >>> os.path.join("just", "do", "d:/", "python", "dot", "com")'d:/python\\dot\\com'>>> >>> os.path.join("just", "do", "d:/", "python", "dot", "g:/", "com")'g:/com'

3.2 os.path.abspath()

將傳入路徑規(guī)范化,返回一個(gè)相應(yīng)的絕對(duì)路徑格式的字符串。

也就是說(shuō)當(dāng)傳入路徑符合“絕對(duì)路徑”的格式時(shí),該函數(shù)僅僅將路徑分隔符替換為適應(yīng)當(dāng)前系統(tǒng)的字符,不做其他任何操作,并將結(jié)果返回。所謂“絕對(duì)路徑的格式”,其實(shí)指的就是一個(gè)字母加冒號(hào),之后跟分隔符和字符串序列的格式:

>>> os.path.abspath("a:/just/do/python")'a:\\just\\do\\python'>>> # 我的系統(tǒng)中并沒有 a 盤

當(dāng)指定的路徑不符合上述格式時(shí),該函數(shù)會(huì)自動(dòng)獲取當(dāng)前工作路徑,并使用os.path.join()函數(shù)將其與傳入的參數(shù)組合成為一個(gè)新的路徑字符串。示例如下:

>>> os.path.abspath("ityouknow")'D:\\justdopython\\ityouknow'

3.3 os.path.basename()

該函數(shù)返回傳入路徑的“基名”,即傳入路徑的最下級(jí)目錄。

>>> os.path.basename("/ityouknow/justdopython/IAmBasename")'IAmBasename'>>> # 我的系統(tǒng)中同樣沒有這么一個(gè)路徑。可見 os.path.basename() 頁(yè)也是單純進(jìn)行字符串處理

整這個(gè)函數(shù)要注意的一點(diǎn)是,返回的“基名”實(shí)際上是傳入路徑最后一個(gè)分隔符之后的子字符串,也就是說(shuō),如果最下級(jí)目錄之后還有一個(gè)分隔符,得到的就會(huì)是一個(gè)空字符串:

>>> os.path.basename("/ityouknow/justdopython/IAmBasename/")''

3.4 os.path.dirname()

與上一個(gè)函數(shù)正好相反,返回的是最后一個(gè)分隔符前的整個(gè)字符串:

>>> os.path.dirname("/ityouknow/justdopython/IAmBasename")'/ityouknow/justdopython'>>> >>> os.path.dirname("/ityouknow/justdopython/IAmBasename/")'/ityouknow/justdopython/IAmBasename'

3.5 os.path.split()

哈哈 ,實(shí)際上前兩個(gè)函數(shù)都是弟弟,這個(gè)函數(shù)才是老大。

函數(shù)os.path.split()的功能就是將傳入路徑以最后一個(gè)分隔符為界,分成兩個(gè)字符串,并打包成元組的形式返回;前兩個(gè)函數(shù)os.path.dirname()os.path.basename()的返回值分別是函數(shù)os.path.split()返回值的第一個(gè)、第二個(gè)元素。就連二者的具體實(shí)現(xiàn)都十分真實(shí):

def basename(p): """Returns the final component of a pathname""" return split(p)[1]

def dirname(p): """Returns the directory component of a pathname""" return split(p)[0]

通過(guò)os.path.join()函數(shù)又可以把它們組合起來(lái)得到原先的路徑。

3.6 os.path.exists()

這個(gè)函數(shù)用于判斷路徑所指向的位置是否存在。若存在則返回True,不存在則返回False

>>> os.path.exists(".")True>>> os.path.exists("./just")True>>> os.path.exists("./Inexistence") # 不存在的路徑False

一般的用法是在需要持久化保存某些數(shù)據(jù)的場(chǎng)景,為避免重復(fù)創(chuàng)建某個(gè)文件,需要在寫入前用該函數(shù)檢測(cè)一下相應(yīng)文件是否存在,若不存在則新建,若存在則在文件內(nèi)容之后增加新的內(nèi)容。

3.7 os.path.isabs()

該函數(shù)判斷傳入路徑是否是絕對(duì)路徑,若是則返回True,否則返回False。當(dāng)然,僅僅是檢測(cè)格式,同樣不對(duì)其有效性進(jìn)行任何核驗(yàn):

>>> os.path.isabs("a:/justdopython")True

3.8 os.path.isfile() 和 os.path.isdir()

這兩個(gè)函數(shù)分別判斷傳入路徑是否是文件或路徑,注意,此處會(huì)核驗(yàn)路徑的有效性,如果是無(wú)效路徑將會(huì)持續(xù)返回False。

>>> # 無(wú)效路徑>>> os.path.isfile("a:/justdopython")False>>> >>> # 有效路徑>>> os.path.isfile("./just/plain_txt")True>>> >>> # 無(wú)效路徑>>> os.path.isdir("a:/justdopython/")False>>> # 有效路徑>>> os.path.isdir("./just/")True

總結(jié)

本文詳細(xì)介紹了與操作系統(tǒng)交互的os模塊中一些常用的屬性和函數(shù),基本可以覆蓋初階的學(xué)習(xí)和使用。有了這些功能,我們已經(jīng)可以寫出一些比較實(shí)用的腳本了。

除了文中介紹的函數(shù)外,os模塊還有很多更加復(fù)雜的功能,但大多是我們暫時(shí)用不到的,以后用到會(huì)進(jìn)一步講解。

示例代碼:python-100-days

參考資料

Python3 文檔-標(biāo)準(zhǔn)庫(kù)

Python3 文檔-庫(kù)-os

系列文章

    第25天:從 0 學(xué)習(xí) Python 0-20 天合集總結(jié)
    第24天:Python Standard Library 02
    第 23 天:Python Standard Library 01
    第22天:Python NameSpace & Scope
    第21天:Web開發(fā) Jinja2模板引擎

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python學(xué)習(xí)筆記《Python核心編程》第9章 文件和輸入輸出
初識(shí)Python(五)
Python常見文件操作的函數(shù)示例
讀《Python編程快速上手 讓繁瑣工作自動(dòng)化》筆記
Python文件目錄操作就是這么6
一個(gè)月能入門Python嗎?月薪25K的大佬給我整理了函數(shù)和模塊資料!
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服