/前言/
對(duì)于學(xué)Python的人來說想必大家os這個(gè)模塊不會(huì)陌生,還有一個(gè)與之緊密相關(guān)的便是sys,但是sys一般很少用,所以今天我們就來說說這兩個(gè)模塊到底有哪些神器的功能。
/sys/
sys模塊包括了一組非常實(shí)用的服務(wù),內(nèi)含很多函數(shù)方法和變量,
用來處理Python運(yùn)行時(shí)配置以及資源,從而可以與前當(dāng)程序之外的系統(tǒng)環(huán)境交互。
也就是說他是一個(gè)很有用的模塊,只是我們平時(shí)很少用到而已。
#命令行參數(shù)List,第一個(gè)元素是程序本身路徑
sys.argv
#返回系統(tǒng)導(dǎo)入的模塊字段,key是模塊名,value是模塊
sys.modules
#退出程序,正常退出時(shí)exit(0)
sys.exit(n)
#返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值
sys.path
#標(biāo)準(zhǔn)輸出
sys.stdout.write('output')
#標(biāo)準(zhǔn)輸入
sys.stdin.readline()[:-1]
#返回所有已經(jīng)導(dǎo)入的模塊名
sys.modules.keys()
#返回所有已經(jīng)導(dǎo)入的模塊
sys.modules.values()
#獲取當(dāng)前正在處理的異常類,exc_type、exc_value、exc_traceback當(dāng)前處理的異常詳細(xì)信息
sys.exc_info()
#獲取Python解釋程序的版本值,16進(jìn)制格式如:0x020403F0
sys.hexversion
#獲取Python解釋程序的版本
sys.version
#解釋器的C的API版本
sys.api_version
#解釋器版本信息 返回major=3, minor=6, micro=6, releaselevel='final', serial=0
#'final’表示最終,也有’candidate’表示候選,serial表示版本級(jí)別,是否有后繼的發(fā)行
sys.version_info
#如果value非空,這個(gè)函數(shù)會(huì)把他輸出到sys.stdout,并且將他保存進(jìn)__builtin__._.指在python的交互式解釋器里,’_’ 代表上次你輸入得到的結(jié)果,hook是鉤子的意思,將上次的結(jié)果鉤過來
sys.displayhook(value)
#打印出給定的回溯和異常sys.stderr。
sys.excepthook(type,value,callback)
#返回當(dāng)前你所用的默認(rèn)的字符編碼格式
sys.getdefaultencoding()
#返回將Unicode文件名轉(zhuǎn)換成系統(tǒng)文件名的編碼的名字
sys.getfilesystemencoding()
#用來設(shè)置當(dāng)前默認(rèn)的字符編碼,如果name和任何一個(gè)可用的編碼都不匹配,拋出 LookupError,這個(gè)函數(shù)只會(huì)被site模塊的sitecustomize使用,一旦別site模塊使用了,他會(huì)從sys模塊移除
sys.setdefaultencoding(name)
#Python解釋器導(dǎo)入的模塊列表
sys.builtin_module_names
#Python解釋程序路徑
sys.executable
#獲取Windows的版本
sys.getwindowsversion()
#記錄python版權(quán)相關(guān)的東西
sys.copyright
#本地字節(jié)規(guī)則的指示器,big-endian平臺(tái)的值是’big’,little-endian平臺(tái)的值是’little’
sys.byteorder
#用來清除當(dāng)前線程所出現(xiàn)的當(dāng)前的或最近的錯(cuò)誤信息
sys.exc_clear()
#返回平臺(tái)獨(dú)立的python文件安裝的位置
sys.exec_prefix
#錯(cuò)誤輸出
sys.stderr
#標(biāo)準(zhǔn)輸入
sys.stdin
#標(biāo)準(zhǔn)輸出
sys.stdout
#返回操作系統(tǒng)平臺(tái)名稱
sys.platform
#最大的Unicode值
sys.maxunicode
#最大的Int值
sys.maxint
#呼叫func(*args),同時(shí)啟用跟蹤。跟蹤狀態(tài)被保存,然后恢復(fù)。
#這是從調(diào)試器從檢查點(diǎn)調(diào)用,以遞歸調(diào)試其他一些代碼。
sys.call_tracing(func,args )
#清除內(nèi)部類型緩存。類型緩存用于加速屬性和方法查找
sys._clear_type_cache()
#返回一個(gè)字典,將每個(gè)線程的標(biāo)識(shí)符映射到調(diào)用該函數(shù)時(shí)該線程中當(dāng)前活動(dòng)的最頂層堆棧幀。
sys._current_frames()
#指定Python DLL句柄的整數(shù)。
sys.dllhandle
#如果這是真的,Python將不會(huì)嘗試在源模塊的導(dǎo)入上編寫.pyc或.pyo文件。
#此值最初設(shè)置為True或 False取決于-B命令行選項(xiàng)
#和 PYTHONDONTWRITEBYTECODE 環(huán)境變量,但您可以自己設(shè)置它來控制字節(jié)碼文件的生成。
sys.dont_write_bytecode
#獲取檢查間隔
sys.getcheckinterval()
#返回用于dlopen()調(diào)用的標(biāo)志的當(dāng)前值。標(biāo)志常量在dl和DLFCN模塊中定義??捎眯裕篣nix。
sys.getdlopenflags()
#返回對(duì)象的引用計(jì)數(shù)。返回的計(jì)數(shù)通常比您預(yù)期的高一個(gè),因?yàn)樗ㄅR時(shí))引用作為參數(shù)getrefcount()。
sys.getrefcount(對(duì)象)
#以字節(jié)為單位返回對(duì)象的大小。對(duì)象可以是任何類型的對(duì)象。所有內(nèi)置對(duì)象都將返回正確的結(jié)果,但這不一定適用于第三方擴(kuò)展,因?yàn)樗翘囟ㄓ趯?shí)現(xiàn)的。
#如果給定,則如果對(duì)象未提供檢索大小的方法,則將返回default。否則TypeError將被提出。
#如果對(duì)象由垃圾收集器管理,則調(diào)用該對(duì)象的方法并添加額外的垃圾收集器開銷。
sys.getsizeof(對(duì)象[,默認(rèn)] )
#從調(diào)用堆棧返回一個(gè)框架對(duì)象。如果給出了可選的整數(shù)深度,
#則返回堆棧頂部下方多次調(diào)用的幀對(duì)象。如果它比調(diào)用堆棧更深,
#ValueError則引發(fā)。深度的默認(rèn)值為零,返回調(diào)用堆棧頂部的幀。
sys._getframe([ 深度] )
#獲取設(shè)置的探查器功能setprofile()。
sys.getprofile()
#獲取設(shè)置的跟蹤功能settrace()。
sys.gettrace()
#返回一個(gè)描述當(dāng)前正在運(yùn)行的Windows版本的命名元組
sys.getwindowsversion()
看到這么多方法大家是不是已經(jīng)哭暈在廁所里了了,不著急,
小編在這里先給大家一個(gè)練手的好案例讓大家開開葷:
那么這個(gè)案例實(shí)現(xiàn)的是什么功能了,大致就是每隔一秒打印一個(gè)#,好像進(jìn)度條一樣的說。
在這里就用到標(biāo)準(zhǔn)輸出流和輸出流刷新了,也算是超級(jí)簡(jiǎn)單的進(jìn)度條了。
sys里面有幾個(gè)可以表示腳本當(dāng)前路徑的函數(shù),可以說是非常強(qiáng)大了,比如說:
大家可以看到,后面兩個(gè)結(jié)果相同,說明后面兩個(gè)效果一樣嗎,那可不一定。
不信,你可以看看我接下來的操作,讓你懷疑人生:
創(chuàng)建兩個(gè)py文件,你懂的,然后分別鍵入代碼:
#cg.py
import sys
def ff():
print(sys.path[0],':',sys.argv[0],':',__file__)
#sys.argv[0] 一般得到的是相對(duì)路徑
ff()
#fd.py
import cg
cg.ff()
可以看到,最后的結(jié)果就是顯然不一樣了,那么這是什么原因產(chǎn)生的了,哦,
原來,在fd中導(dǎo)入cg執(zhí)行的sys.argv[0]還是指的是運(yùn)行的主文件fd.py,而file卻輸出的是cg.py.
順便跟大家科普以下查看模塊下有哪些方法的一個(gè)函數(shù):dir()
所有的函數(shù)都打印出來了,當(dāng)然,如果你想快速了解每個(gè)方法的用法,則可以使用help()函數(shù):
可以說是很強(qiáng)大了。
接下來我們?cè)賮碚f說另一個(gè)非常牛逼的東西---------os。
/OS/
一、文件操作(os直屬常用方法)
# 關(guān)閉文件描述符 hw
os.close(hw)
# 關(guān)閉所有文件描述符,從 hw1(包含) 到 hw2(不包含), 錯(cuò)誤會(huì)忽略
os.closerange(hw1,hw2)
# 通過文件描述符改變當(dāng)前工作目錄
os.fchdir(hw)
# 改變一個(gè)文件的訪問權(quán)限,該文件由參數(shù)hw指定,參數(shù)mode是Unix下的文件訪問權(quán)限。
os.fchmod(hw, mode)
# 修改一個(gè)文件的所有權(quán),這個(gè)函數(shù)修改一個(gè)文件的用戶ID和用戶組ID,該文件由文件描述符hw指定。
os.fchown(hw, id1, id2)
# 強(qiáng)制將文件寫入磁盤,該文件由文件描述符hw指定,但是不強(qiáng)制更新文件的狀態(tài)信息。
os.fdatasync(hw)
#通過文件描述符hw 創(chuàng)建一個(gè)文件對(duì)象,并返回這個(gè)文件對(duì)象
os.fdopen(hw[, mode[, bufsize]])
#返回一個(gè)打開的文件的系統(tǒng)配置信息。name為檢索的系統(tǒng)配置的值,
#它也許是一個(gè)定義系統(tǒng)值的字符串,這些名字在很多標(biāo)準(zhǔn)中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
os.fpathconf(hw, name)
#返回文件描述符hw的狀態(tài),像stat()。
os.fstat(hw)
#返回包含文件描述符hw的文件的文件系統(tǒng)的信息,像 statvfs()
os.fstatvfs(hw)
#強(qiáng)制將文件描述符為hw的文件寫入硬盤。
os.fsync(hw)
#裁剪文件描述符hw對(duì)應(yīng)的文件, 所以它最大不能超過文件大小。
os.ftruncate(hw,length)
#復(fù)制文件描述符hw
os.dup(hw)
# 將一個(gè)文件描述符hw復(fù)制到另一個(gè)hw1
os.dup2(hw,hw1)
# 返回與終端hw(一個(gè)由os.open()返回的打開的文件描述符)關(guān)聯(lián)的進(jìn)程組
os.tcgetpgrp(hw)
# 設(shè)置與終端hw(一個(gè)由os.open()返回的打開的文件描述符)關(guān)聯(lián)的進(jìn)程組為hw1。
os.tcsetpgrp(hw, hw1)
# 返回唯一的路徑名用于創(chuàng)建臨時(shí)文件。
os.tempnam([dir[, prefix]])
# 返回一個(gè)打開的模式為(w+b)的文件對(duì)象 .這文件對(duì)象沒有文件夾入口,沒有文件描述符,將會(huì)自動(dòng)刪除。
os.tmpfile()
# 為創(chuàng)建一個(gè)臨時(shí)文件返回一個(gè)唯一的路徑
os.tmpnam()
# 返回一個(gè)字符串,它表示與文件描述符hw 關(guān)聯(lián)的終端設(shè)備。如果hw 沒有與終端設(shè)備關(guān)聯(lián),則引發(fā)一個(gè)異常。
os.ttyname(hw)
# 刪除文件路徑
os.unlink(path)
# 返回指定的path文件的訪問和修改的時(shí)間。
os.utime(path, times)
# 輸出在文件夾中的文件名通過在樹中游走,向上或者向下。
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
# 寫入字符串到文件描述符hw中. 返回實(shí)際寫入的字符串長(zhǎng)度
os.write(hw, str)
# 獲取指定路徑的文件系統(tǒng)統(tǒng)計(jì)信息
os.statvfs(path)
# 返回當(dāng)前工作目錄
os.getcwd()
# 返回一個(gè)當(dāng)前工作目錄的Unicode對(duì)象
os.getcwdu()
# 如果文件描述符hw是打開的,同時(shí)與tty(-like)設(shè)備相連,則返回true, 否則False。
os.isatty(hw)
# 設(shè)置路徑的標(biāo)記為數(shù)字標(biāo)記,類似 chflags(),但是沒有軟鏈接
os.lchflags(path, flags)
# 修改連接文件權(quán)限
os.lchmod(path, mode)
# 更改文件所有者,類似 chown,但是不追蹤鏈接。
os.lchown(path, uid, gid)
# 返回path指定的文件夾包含的文件或文件夾的名字的列表。
os.listdir(path)
# 設(shè)置文件描述符 fd當(dāng)前位置為pos, how方式修改: SEEK_SET 或者 0
#設(shè)置從文件開始的計(jì)算的pos; SEEK_CUR或者 1 則從當(dāng)前位置計(jì)算;
#os.SEEK_END或者2則從文件尾部開始. 在unix,Windows中有效
os.lseek(fd, pos, how)
# 打開一個(gè)文件,并且設(shè)置需要的打開選項(xiàng),mode參數(shù)是可選的
os.open(file, flags[, mode])
# 打開一個(gè)新的偽終端對(duì)。返回 pty 和 tty的文件描述符。
os.openpty()
# 返回相關(guān)文件的系統(tǒng)配置信息。
os.pathconf(path, name)
# 用于分割文件路徑的字符串
os.pathsep
# 獲取當(dāng)前目錄的父目錄字符串名:('..')
os.pardir
# 創(chuàng)建一個(gè)管道. 返回一對(duì)文件描述符(r, w) 分別為讀和寫
os.pipe()
# 從一個(gè) command 打開一個(gè)管道
os.popen(command[, mode[, bufsize]])
# 字符串指示當(dāng)前使用平臺(tái)。win->'nt'; Linux->'posix'
os.name
# 從文件描述符hw中讀取最多n個(gè)字節(jié),返回包含讀取字節(jié)的字符串,
#文件描述符hw對(duì)應(yīng)文件已達(dá)到結(jié)尾, 返回一個(gè)空字符串。
os.read(hw, n)
#返回路徑所在的根目錄,主目錄主文件
os.walk(path)
#返回路徑下的目錄和文件
os.listdir(path)
#切換當(dāng)前程序操作的路徑
os.chdir(path)
#重命名文件
os.rename(oldfile,newfile)
二、路徑操作
#將文件路徑和文件名分割(會(huì)將最后一個(gè)目錄作為文件名而分離)
os.path.split(filename)
#將文件路徑和文件擴(kuò)展名分割成一個(gè)元組
os.path.splitext(filename)
#返回文件路徑的目錄部分
os.path.dirname(filename)
#返回文件路徑的文件名部分
os.path.basename(filename)
#將文件路徑和文件名湊成完整文件路徑
os.path.join(dirname,basename)
#獲得絕對(duì)路徑
os.path.abspath(name)
#把路徑分割為掛載點(diǎn)和文件名
os.path.splitunc(path)
#規(guī)范path字符串形式
os.path.normpath(path)
#判斷文件或目錄是否存在
os.path.exists()
#如果path是絕對(duì)路徑,返回True
os.path.isabs()
#返回path的真實(shí)路徑
os.path.realpath(path)
#從start開始計(jì)算相對(duì)路徑
os.path.relpath(path[, start])
#轉(zhuǎn)換path的大小寫和斜杠
os.path.normcase(path)
#判斷name是不是一個(gè)目錄,name不是目錄就返回false
os.path.isdir()
#判斷name是不是一個(gè)文件,不存在返回false
os.path.isfile()
#判斷文件是否連接文件,返回boolean
os.path.islink()
#指定路徑是否存在且為一個(gè)掛載點(diǎn),返回boolean
os.path.ismount()
#是否相同路徑的文件,返回boolean
os.path.samefile()
#返回最近訪問時(shí)間 浮點(diǎn)型
os.path.getatime()
#返回上一次修改時(shí)間 浮點(diǎn)型
os.path.getmtime()
#返回文件創(chuàng)建時(shí)間 浮點(diǎn)型
os.path.getctime()
#返回文件大小 字節(jié)單位
os.path.getsize()
#返回list(多個(gè)路徑)中,所有path共有的最長(zhǎng)的路徑
os.path.commonprefix(list)
#路徑存在則返回True,路徑損壞也返回True
os.path.lexists
#把path中包含的”~”和”~user”轉(zhuǎn)換成用戶目錄
os.path.expanduser(path)
#根據(jù)環(huán)境變量的值替換path中包含的”$name”和”${name}”
os.path.expandvars(path)
#判斷fp1和fp2是否指向同一文件
os.path.sameopenfile(fp1, fp2)
#判斷stat tuple stat1和stat2是否指向同一個(gè)文件
os.path.samestat(stat1, stat2)
#一般用在windows下,返回驅(qū)動(dòng)器名和路徑組成的元組
os.path.splitdrive(path)
#遍歷path,給每個(gè)path執(zhí)行一個(gè)函數(shù)
os.path.walk(path, visit, arg)
#設(shè)置是否支持unicode路徑名
os.path.supports_unicode_filenames()
三、進(jìn)程管理
# 創(chuàng)建一個(gè)軟鏈接
os.symlink(src, dst)
# 創(chuàng)建硬鏈接,名為參數(shù) dst,指向參數(shù) src
os.link(src, dst)
# 像stat(),但是沒有軟鏈接
os.lstat(path)
# 運(yùn)行shell命令,直接顯示
os.system("bash command")
# 改變當(dāng)前進(jìn)程的根目錄
os.chroot(path)
#shell命令,不返回結(jié)果,但是可以進(jìn)行讀取
os.popen(command).read()
# 當(dāng)前平臺(tái)使用的行終止符,win下為"\t\n",Linux下為"\n"
os.linesep
#路徑連接符
os.sep
#從原始的設(shè)備號(hào)中提取設(shè)備major號(hào)碼 (使用stat中的st_dev或者st_rdev field)。
os.major(device)
# 以major和minor設(shè)備號(hào)組成一個(gè)原始設(shè)備號(hào)
os.makedev(major, minor)
# 遞歸文件夾創(chuàng)建函數(shù)。像mkdir(),但創(chuàng)建的所有intermediate-level文件夾需要包含子文件夾。
os.makedirs(path[, mode])
# 從原始的設(shè)備號(hào)中提取設(shè)備minor號(hào)碼(使用stat中的st_dev或者st_rdev field )。
os.minor(device)
# 以數(shù)字mode的mode創(chuàng)建一個(gè)名為path的文件夾.默認(rèn)的 mode 是 0777 (八進(jìn)制)。
os.mkdir(path[, mode])
# 創(chuàng)建命名管道,mode 為數(shù)字,默認(rèn)為 0666 (八進(jìn)制)
os.mkfifo(path[, mode])
# 創(chuàng)建一個(gè)名為filename文件系統(tǒng)節(jié)點(diǎn)(文件,設(shè)備特別文件或者命名pipe)。
os.mknod(filename[, mode=0600, device])
四、環(huán)境參數(shù)
#檢驗(yàn)權(quán)限模式
os.access(path, mode)
# 設(shè)置路徑的標(biāo)記為數(shù)字標(biāo)記。
os.chflags(path, flags)
# 更改權(quán)限
os.chmod(path, mode)
# 更改文件所有者
os.chown(path, uid, gid)
#獲得當(dāng)前系統(tǒng)登陸用戶名
os.getlogin()
#獲得當(dāng)前系統(tǒng)的CPU數(shù)量
os.cpu_count()
# 獲得n個(gè)字節(jié)長(zhǎng)度的隨機(jī)字符串,通常用于加解密運(yùn)算
os.urandom(n)
# 獲取系統(tǒng)所有環(huán)境變量
os.environ
#獲取某個(gè)特定的環(huán)境變量的值
os.getenv('CYGWIN')
os.environ.get('CYGWIN')
#設(shè)置環(huán)境變量
os.environ.setdefault(key,value)
#獲取某個(gè)特定的環(huán)境變量的值的byte形式
os.getenvb('CYGWIN')
五、stat子庫(kù)
#獲取到的文件屬性列表
fileStats = os.stat(path)
#獲取文件的模式
fileStats[stat.ST_MODE]
#文件大小
fileStats[stat.ST_SIZE]
#文件最后修改時(shí)間
fileStats[stat.ST_MTIME]
#文件最后訪問時(shí)間
fileStats[stat.ST_ATIME]
#文件創(chuàng)建時(shí)間
fileStats[stat.ST_CTIME]
#是否目錄
stat.S_ISDIR(fileStats[stat.ST_MODE])
#是否一般文件
stat.S_ISREG(fileStats[stat.ST_MODE])
#是否連接文件
stat.S_ISLNK(fileStats[stat.ST_MODE])
#是否COCK文件
stat.S_ISSOCK(fileStats[stat.ST_MODE])
#是否命名管道
stat.S_ISFIFO(fileStats[stat.ST_MODE])
#是否塊設(shè)備
stat.S_ISBLK(fileStats[stat.ST_MODE])
#是否字符設(shè)置
stat.S_ISCHR(fileStats[stat.ST_MODE])
6、一鍵死機(jī)
為什么要說這個(gè)呢?完全是為了好玩,哈哈哈。
我們都知道os 能很輕松打開一個(gè)程序,只要你知道這個(gè)源程序根目錄的位置。
所以我們一般都會(huì):
os.system('notepad') #打開記事本
os.system('start notepad')#打開記事本
這樣可以很輕松打開一個(gè)記事本,那么我們要想讓它無限打開。我給它整個(gè)死循環(huán),給它個(gè)無限遞歸不就完了。是不是很簡(jiǎn)單了?
還有一種比較優(yōu)雅的打開程序的方法,那就是popen方法:
pp=os.popen('notebook')
不僅如此,我們還能看到它執(zhí)行結(jié)果后的返回值。
print(pp.read())
哈哈,也是很666了。
/小結(jié)/
1、本文基于Python編程語(yǔ)言,主要介紹了Python操作文件目錄的兩個(gè)大庫(kù)sys和os,在實(shí)際應(yīng)用中十分的常用,希望大家了解。本文內(nèi)容十分豐富,歡迎大家積極學(xué)習(xí)。
2、結(jié)合部分實(shí)際案例,圖文并茂,幫助大家更好的理解文件操作。
聯(lián)系客服