Python包之OS

參考:https://docs.python.org/3/library/os.html

Python中對(duì)OS模塊的定位是:提供了使用操作系統(tǒng)的工具接口。
如果你想讀寫文件旺拉,可以參考o(jì)pen();
如果你想操作文件路徑筐乳,參考o(jì)s.path模塊洞难;
如果你想在命令行讀取所有文件的所有行,參考fileinput模塊红淡;
如果你想創(chuàng)建臨時(shí)文件或目錄,參考tempfile模塊降铸;
如果你想更高級(jí)的文件和路徑處理在旱,參考shutil模塊;

os.error

內(nèi)置的OSError異常類型推掸,比如在使用os模塊中的函數(shù)接口時(shí)桶蝎,在參數(shù)中提供了無(wú)效的文件或路徑,就回報(bào)錯(cuò)os.error谅畅。

os.name

該變量返回當(dāng)前操作系統(tǒng)的類型登渣,當(dāng)前只注冊(cè)了3個(gè)值:分別是posix , nt , java, 對(duì)應(yīng)linux/windows/java虛擬機(jī)毡泻。

print(os.name)
# posix

文件名胜茧,命令行參數(shù)和環(huán)境變量

在Python中,文件名仇味,命令行參數(shù)和環(huán)境變量都是用字符串類型來(lái)表示竹揍。

進(jìn)程參數(shù)

接下來(lái)的這些函數(shù)和數(shù)據(jù)提供了當(dāng)前進(jìn)程和用戶的信息狀態(tài)和操作接口。

os.ctermid()

返回進(jìn)程控制終端的文件名邪铲,適用于Unix系統(tǒng)。

os.environ

返回字符串到環(huán)境變量的映射无拗。

print(os.environ)
# environ({'PATH': '/anaconda3/bin','HOME': '/Users/sjd'})

os.chdir(path)

改變當(dāng)前工作目錄到指定的路徑带到,path為要切換到的新路徑。

os.fchdir(fd)

通過(guò)文件描述符改變當(dāng)前工作目錄英染。
文件描述符是內(nèi)核為了高效管理已經(jīng)被打開的文件所創(chuàng)建的索引揽惹,

進(jìn)程通過(guò)文件描述符來(lái)訪問(wèn)文件。 在程序剛啟動(dòng)的時(shí)候默認(rèn)有3個(gè)文件描述符:0(標(biāo)準(zhǔn)輸入)四康,1(標(biāo)準(zhǔn)輸出)搪搏,2(標(biāo)準(zhǔn)錯(cuò)誤),系統(tǒng)默認(rèn)提供了 0~2的文件描述符闪金,之后的 當(dāng)我們進(jìn)行 open,create等操作的時(shí)候 自動(dòng)添加進(jìn)表

所以int creat(const char * ,mode_t)返回的文件int 就是你所進(jìn)行操作的文件的唯一身份標(biāo)示疯溺,

然后你只要拿著這個(gè)ID 然后告訴系統(tǒng)給我找xx论颅, write(int fd,char *buf,int lenght) 通過(guò)fd得到準(zhǔn)確文件 然后寫入。

當(dāng)我們新建creat囱嫩,打開open 之后恃疯,得到的fd 是從3開始的 因?yàn)榍懊娴娜齻€(gè)被系統(tǒng)占了在OS X系統(tǒng)下測(cè)試 文件描述符表 自增,當(dāng)釋放close之后墨闲,fd變成-1今妄,如果再繼續(xù)新建 則填補(bǔ)之前的空缺。

os.getcwd()

返回當(dāng)前工作目錄鸳碧。

os.fsencode(filename)

把字符串類型的文件名翻譯成bytes類型的文件名盾鳞;os.fsdecode()實(shí)現(xiàn)相反的功能。

os.fspath(path)

返回路徑的文件系統(tǒng)表示瞻离。

os.getenv(key,default=None)

如果環(huán)境變量中存在key腾仅,返回環(huán)境變量key的值,否則返回default的值琐脏。

os.putenv(key,value)

設(shè)置環(huán)境變量key的值為value攒砖。

文件和路徑

os.access(path,mode)

使用當(dāng)前uid/gid檢測(cè)對(duì)路徑path是否有訪問(wèn)權(quán)限。其中日裙,path為要檢測(cè)是否有權(quán)限的路徑吹艇,mode為權(quán)限類別,值可以為os.F_OK昂拂、os.R_OK受神、os.W_OK、os.X_OK中的一個(gè)或多個(gè)格侯;

  • os.F_OK:測(cè)試path是否存在
  • os.R_OK:測(cè)試path是否可讀
  • os.W_OK:測(cè)試path是否可寫
  • os.X_OK:測(cè)試path是否可執(zhí)行
os.access("provider.py", os.F_OK)
# True
os.access("provider.py", os.R_OK)
# True
os.access("provider.py", os.W_OK)
# True
os.access("provider.py", os.X_OK)
# False
os.access("provider.py", os.F_OK | os.X_OK)
# True

os.chdir(path)

切換當(dāng)前的工作路徑為path指定的路徑鼻听。

os.chflags(path,flags)

設(shè)置路徑path的標(biāo)記為flags,flags為數(shù)字標(biāo)記联四,多個(gè)flags可以使用or組合撑碴。flags可以為以下值或以下值的組合:

  • stat.UF_NODUMP:非轉(zhuǎn)儲(chǔ)文件
  • stat.UF_IMMUTABLE:文件是只讀的
  • stat.UF_APPEND:文件只能追加內(nèi)容
  • stat.UF_NOUNLINK:文件不可刪除
  • stat.UF_OPAQUE:目錄不透明,需要通過(guò)聯(lián)合堆棧查看
  • stat.SF_ARCHIVED:可存檔文件(超級(jí)用戶可設(shè))
  • stat.SF_IMMUTABLE:文件是只讀的(超級(jí)用戶可設(shè))
  • stat.SF_APPEND:文件只能追加內(nèi)容(超級(jí)用戶可設(shè))
  • stat.SF_NOUNLINK:文件不可刪除(超級(jí)用戶可設(shè))
  • stat.SF_SNAPSHOT:快照文件(超級(jí)用戶可設(shè))
import stat
# 為文件設(shè)置標(biāo)記朝墩,使得它不能被重命名和刪除
os.chflags("provider.py",stat.SF_NOUNLINK)

os.chmod(path,mode)

更改文件或目錄的權(quán)限醉拓。
path -- 文件名路徑或目錄路徑
mode -- 可用以下選項(xiàng)按位或操作生成, 目錄的讀權(quán)限表示可以獲取目錄里文件名列表收苏, 寫權(quán)限表示可以獲取文件并且可以修改內(nèi)容亿卤,執(zhí)行權(quán)限表示可以把工作目錄切換到此目錄 ,刪除添加目錄里的文件必須同時(shí)有寫和執(zhí)行權(quán)限 鹿霸,文件權(quán)限以用戶id->組id->其它順序檢驗(yàn),最先匹配的允許或禁止權(quán)限被應(yīng)用排吴。

  • stat.S_IXOTH: 其他用戶有執(zhí)行權(quán)0o001
  • stat.S_IWOTH: 其他用戶有寫權(quán)限0o002
  • stat.S_IROTH: 其他用戶有讀權(quán)限0o004
  • stat.S_IRWXO: 其他用戶有全部權(quán)限(權(quán)限掩碼)0o007
  • stat.S_IXGRP: 組用戶有執(zhí)行權(quán)限0o010
  • stat.S_IWGRP: 組用戶有寫權(quán)限0o020
  • stat.S_IRGRP: 組用戶有讀權(quán)限0o040
  • stat.S_IRWXG: 組用戶有全部權(quán)限(權(quán)限掩碼)0o070
  • stat.S_IXUSR: 擁有者具有執(zhí)行權(quán)限0o100
  • stat.S_IWUSR: 擁有者具有寫權(quán)限0o200
  • stat.S_IRUSR: 擁有者具有讀權(quán)限0o400
  • stat.S_IRWXU: 擁有者有全部權(quán)限(權(quán)限掩碼)0o700
  • stat.S_ISVTX: 目錄里文件目錄只有擁有者才可刪除更改0o1000
  • stat.S_ISGID: 執(zhí)行此文件其進(jìn)程有效組為文件所在組0o2000
  • stat.S_ISUID: 執(zhí)行此文件其進(jìn)程有效用戶為文件所有者0o4000
  • stat.S_IREAD: windows下設(shè)為只讀
  • stat.S_IWRITE: windows下取消只讀
import stat
# 設(shè)置用戶組對(duì)文件具有執(zhí)行權(quán)限
os.chmod("provider.py",stat.S_IXGRP)
# 設(shè)置其他用戶對(duì)文件具有寫權(quán)限
os.chmod("provider.py",stat.S_IWOTH)

os.chown(path,uid,gid)

更改路徑的擁有者和group id為uid和gid。如果不修改可以設(shè)置為-1懦鼠,并且需要超級(jí)用戶權(quán)限來(lái)執(zhí)行權(quán)限修改操作钻哩。
path -- 設(shè)置權(quán)限的文件路徑
uid -- 所屬用戶ID
gid -- 所屬用戶組ID

# 設(shè)置所有者ID為100
os.chown("provider.py",100,-1)

os.chroot(path)

更改當(dāng)前進(jìn)程的根目錄為path屹堰。

os.getcwd()

返回當(dāng)前工作目錄。

os.listdir(path=".")

返回path目錄路徑下的文件列表憋槐,列表沒有固定的順序双藕。

os.mkdir(path)

創(chuàng)建目錄path。如果目錄已經(jīng)存在阳仔,會(huì)拋出異常FileExistsError忧陪。

os.makedirs(name)

遞歸的目錄創(chuàng)建,遞歸的意思是創(chuàng)建所有到達(dá)葉子目錄的中間目錄近范。

os.major(device)

從原始設(shè)備號(hào)(通常是stat中的st_dev或st_rdev)中提取設(shè)備major號(hào)碼嘶摊。

os.minor(device)

從原始設(shè)備號(hào)(通常是stat中的st_dev或st_rdev)中提取設(shè)備minor號(hào)碼。

os.makedev(major, minor)

根據(jù)設(shè)備的major號(hào)碼和minor號(hào)碼組成原始設(shè)備號(hào)评矩。

os.remove(path,*,dir_fd=None)

刪除文件路徑path叶堆。如果path指向的是目錄路徑,會(huì)拋出異常IsADirectoryError斥杜。如果要?jiǎng)h除目錄虱颗,使用rmdir。

os.removedirs(name)

遞歸的刪除目錄蔗喂。與rmdir功能相似忘渔,不同的是,如果葉子目錄被刪除之后缰儿,removedirs會(huì)連續(xù)的刪除每一層上級(jí)目錄畦粮,直到拋出異常(異常會(huì)被忽略,因?yàn)楫惓MǔR馕吨蠈幽夸洖榉强漳夸洠?/p>

os.rename(src,dst,*,src_dir_fd=None,dst_dir_fd=None)

重命名文件或路徑src為dst乖阵,如果dst已經(jīng)存在宣赔,會(huì)拋出異常。

os.renames(old,new)

遞歸的重命名文件或目錄瞪浸。功能與rename類似儒将,不同在于,renames首先創(chuàng)建new路徑(即重命名之后的路徑)的中間路徑对蒲,然后創(chuàng)建完整new路徑钩蚊,最后,會(huì)使用removedirs刪除掉old路徑(實(shí)際上刪除的是old路徑與new路徑不重合的部分)齐蔽。

os.replace(src,dst)

重命名文件或路徑src為dst。如果dst是目錄床估,拋出異常OSError含滴。如果dst是文件且已經(jīng)存在,且用戶具有權(quán)限丐巫,dst會(huì)被替換掉谈况。

os.rmdir(path)

刪除path目錄勺美。如果path不存在,或者path非空碑韵,會(huì)拋出異常FileNotFoundError或OSError赡茸。如果要?jiǎng)h除整個(gè)目錄樹,可以使用shutil.rmtree()祝闻。

os.path

os.path.abspath(path)

返回path的絕對(duì)路徑占卧,效果等同于使用normpath:normpath(join(os.getcwd(), path))。

os.path.abspath("provider.py")
# /Users/sjd/Documents/4paradigm/datagen/provider.py

os.path.basename(path)

返回路徑path的文件名联喘,也就是對(duì)path調(diào)用os.path.split函數(shù)返回的元組的第二個(gè)元素华蜒。

os.path.basename("/Users/sjd/Documents/4paradigm/datagen/provider.py")
# provider.py
os.path.basename("/Users/sjd/Documents/4paradigm/datagen/")
# 返回空字符串

os.path.commonpath(paths)

paths為一個(gè)序列類型,其中每個(gè)元素表示一個(gè)路徑豁遭,函數(shù)返回結(jié)果為每個(gè)元素所表示的路徑的最長(zhǎng)公共子路徑叭喜。如果paths為空,或者paths同時(shí)包含絕對(duì)路徑和相對(duì)路徑蓖谢,或者paths同時(shí)包含不同驅(qū)動(dòng)類型的路徑(比如Linux系統(tǒng)的路徑和Windows系統(tǒng)的路徑)捂蕴,則拋出異常ValueError。

# 全部為絕對(duì)路徑
os.path.commonpath(["/Users/sjd/Documents/4paradigm/datagen/provider.py", "/Users/sjd/Documents/4paradigm/datagen/constant.py"])
# /Users/sjd/Documents/4paradigm/datagen
# 全部為相對(duì)路徑
os.path.commonpath(["4paradigm/datagen/provider.py", "4paradigm/datagen/constant.py"])
# 4paradigm/datagen
os.path.commonpath(["Documents/4paradigm/datagen/provider.py", "4paradigm/datagen/constant.py"])
# 返回空字符串
# 拋出異常的情況
os.path.commonpath([])
# ValueError: commonpath() arg is an empty sequence
os.path.commonpath(["/Users/sjd/Documents/4paradigm/datagen/provider.py", "datagen/constant.py"])
# ValueError: Can't mix absolute and relative paths

os.path.commonprefix(list)

list中的每個(gè)元素表示一個(gè)路徑闪幽,函數(shù)返回每個(gè)路徑的最長(zhǎng)的共有路徑前綴啥辨,因?yàn)橛?jì)算方式為逐個(gè)字符進(jìn)行比較,所以可能返回的結(jié)果并非有效的路徑沟使,如果要返回有效路徑委可,可以使用commonpath。

os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
# /usr/l
os.path.commonpath(['/usr/lib', '/usr/local/lib'])
# '/usr'

os.path.dirname(path)

返回path路徑的目錄部分腊嗡,也就是對(duì)path調(diào)用os.path.split函數(shù)返回的元組的第一個(gè)元素着倾。

os.path.dirname("Documents/4paradigm/datagen/provider.py")
# Documents/4paradigm/datagen

os.path.exists(path)

如果path指向的路徑已存在,則返回True燕少,否則返回False卡者。

os.path.expanduser(path)

在Unix和Windows系統(tǒng)中,返回path路徑中的~被替換成用戶的home目錄之后的結(jié)果客们。

os.path.expandvars(path)

path路徑中的name或者{name}被環(huán)境變量中對(duì)應(yīng)名稱的值替代崇决。

os.path.getatime(path)

返回最后一次訪問(wèn)path的時(shí)間,返回值的格式為一個(gè)float類型的數(shù)值底挫,表示距離epoch基準(zhǔn)時(shí)間1970-01-01 00:00:00的秒數(shù)恒傻。如果path表示的路徑不存在或者沒有權(quán)限,拋出異常OSError建邓。

os.path.getmtime(path)

返回最后一次修改path的時(shí)間盈厘,返回值的格式為一個(gè)float類型的數(shù)值,表示距離epoch基準(zhǔn)時(shí)間1970-01-01 00:00:00的秒數(shù)官边。如果path表示的路徑不存在或者沒有權(quán)限沸手,拋出異常OSError外遇。

os.path.getsize(path)

返回path表示的文件或路徑的大小,以byte字節(jié)為單位契吉。如果path表示的路徑不存在或者沒有權(quán)限跳仿,拋出異常OSError。

os.path.isabs(path)

如果path是絕對(duì)路徑捐晶,返回True菲语,否則返回False。

os.path.isfile(path)

如果path表示的是已存在的文件路徑租悄,返回True谨究。

os.path.isdir(path)

如果path表示的是已存在的目錄,返回True泣棋。

os.path.islink(path)

如果path表示的是鏈接胶哲,返回True。

os.path.ismount(path)

判斷path是否為掛載點(diǎn)潭辈。

os.path.join(path, *paths)

連接一個(gè)或多個(gè)路徑鸯屿,path和多個(gè)*paths的連接會(huì)使用路徑分隔符。

os.path.normcase(path)

對(duì)path的字母大小寫進(jìn)行normalize把敢。在Windows系統(tǒng)中寄摆,path中的所有字母都轉(zhuǎn)成小寫,并且把正斜杠轉(zhuǎn)成反斜杠修赞。在其他操作系統(tǒng)中婶恼,返回path本身。

os.path.normpath(path)

對(duì)path進(jìn)行normalize柏副,刪除多余的路徑分隔符勾邦。

os.path.split(path)

split the path into a pair (head, tail),其中tail是path中最后的部分割择,并且永遠(yuǎn)不會(huì)含有斜杠眷篇,head是除了tail之外的部分。如果path以斜杠結(jié)尾荔泳,tail為空蕉饼;如果path中不包含斜杠,head為空玛歌;如果path為空昧港,head和tail都是空。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末支子,一起剝皮案震驚了整個(gè)濱河市创肥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖瓤的,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吞歼,居然都是意外死亡圈膏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門篙骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稽坤,“玉大人,你說(shuō)我怎么就攤上這事糯俗∧蛲剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵得湘,是天一觀的道長(zhǎng)杖玲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)淘正,這世上最難降的妖魔是什么摆马? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮鸿吆,結(jié)果婚禮上囤采,老公的妹妹穿的比我還像新娘。我一直安慰自己惩淳,他們只是感情好蕉毯,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著思犁,像睡著了一般代虾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抒倚,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天褐着,我揣著相機(jī)與錄音,去河邊找鬼托呕。 笑死含蓉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的项郊。 我是一名探鬼主播馅扣,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼着降!你這毒婦竟也來(lái)了差油?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓄喇,沒想到半個(gè)月后发侵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妆偏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年刃鳄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钱骂。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叔锐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出见秽,到底是詐尸還是另有隱情愉烙,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布解取,位于F島的核電站步责,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏禀苦。R本人自食惡果不足惜勺择,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伦忠。 院中可真熱鬧省核,春花似錦、人聲如沸昆码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赋咽。三九已至旧噪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脓匿,已是汗流浹背淘钟。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陪毡,地道東北人米母。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像毡琉,于是被迫代替她去往敵國(guó)和親铁瞒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容