參考: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}被環(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都是空。