溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python系統(tǒng)模塊os

發(fā)布時(shí)間:2020-08-12 00:16:04 來(lái)源:網(wǎng)絡(luò) 閱讀:172 作者:阿飛coach 欄目:編程語(yǔ)言

在昨天的文章里,我們說(shuō)到,python官方庫(kù)中比較重要的兩個(gè)模塊是sys和os,然后在昨天的文章中列出了幾個(gè)sys模塊內(nèi)部函數(shù)的用法。今天我們來(lái)看一下另外一個(gè)重要模塊os的用法。
os模塊是直接和系統(tǒng)調(diào)用或者說(shuō)系統(tǒng)提供的api打交道的模塊,因此可以把它的功能分為3大類,分別是:

  1. POSIX工具,即處理文件系統(tǒng)相關(guān)的功能
  2. 提供跨平臺(tái)能力的功能或函數(shù)
  3. 運(yùn)行系統(tǒng)命令相關(guān)的函數(shù)

下面我們來(lái)一一看這些功能常用的函數(shù)有哪些。

1. 文件系統(tǒng)處理相關(guān)函數(shù)

一般在做文件或目錄操作的時(shí)候,最常用的基本都是增刪改查,os模塊提供了對(duì)應(yīng)的函數(shù)如下:

  • os.remove() 刪除文件
  • os.rename() 重命名文件或目錄
  • os.mkdir() / os.makedirs() 創(chuàng)建單個(gè)目錄 / 創(chuàng)建多級(jí)目錄
  • os.rmdir() / os.removedirs() 刪除空目錄 / 刪除多級(jí)空目錄
  • os.copy('_dir', 'newfile') 復(fù)制文件或目錄到新的目錄中,
  • os.listdir() 顯示當(dāng)前目錄下的文件或目錄,如果參數(shù)是路徑,那么顯示這個(gè)路徑下的文件。
  • os.chdir('/path/to/new/dir') 切換當(dāng)前工作目錄到新的工作目錄

在上面的代碼中我們可以看到,os模塊提供了對(duì)文件的修改、刪除和查詢方法,對(duì)目錄提供了創(chuàng)建、刪除、修改和刪除的方法。但是沒有創(chuàng)建文件的方法,這是為什么呢?因?yàn)樵趐ython中,創(chuàng)建文件一般是通過(guò)Python提供的通用open方法來(lái)實(shí)現(xiàn)的。os.open這個(gè)方法有,但是只能打開已有的文件,在文件不存在時(shí)會(huì)報(bào)錯(cuò),而不會(huì)自動(dòng)去創(chuàng)建這個(gè)文件。

來(lái)看一下幾個(gè)示例

# 創(chuàng)建文件
>>> f = open('test.txt', 'w')
>>> f.close()
>>> os.listdir()
['test.txt']

# 創(chuàng)建目錄和多級(jí)目錄
>>> os.mkdir('t1')
>>> os.makedirs('t1/t2/t3')
>>> 
>>> os.listdir()
['test.txt', 't1']
>>> os.listdir('t1')
['t2']
>>> os.listdir('t1/t2')
['t3']

# 重命名文件
>>> os.rename('test.txt', 'test_rename_func.txt')
>>> os.listdir()
['t1', 'test_rename_func.txt']

# 重命名目錄
>>> os.rename('t1', 'test1')
>>> os.listdir()
['test_rename_func.txt', 'test1']

# 刪除文件
>>> os.remove('test_rename_func.txt')
>>> os.listdir()
['test1']

# 刪除目錄,此時(shí)test1為非空目錄,報(bào)錯(cuò)。
>>> os.rmdir('test1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 39] Directory not empty: 'test1'

# 迭代刪除多個(gè)空目錄,此時(shí)要出給出多個(gè)目錄完整路徑
>>> os.removedirs('test1/t2/t3')
>>> os.listdir()
[]

在上面的示例中,我們演示了os模塊中用來(lái)增刪改查文件和目錄的相關(guān)函數(shù),最后留下一個(gè)小問(wèn)題,非空的目錄該怎么刪除呢?感興趣的同學(xué)可以嘗試以下,我們明天來(lái)答疑解惑。

2. 提供跨平臺(tái)能力的功能或函數(shù)

提到跨平臺(tái),可能我們最常遇到的就是兩個(gè)東西,一個(gè)是換行符,一個(gè)是路徑分隔符。
在windows系統(tǒng)中,換行符是 \r\n,而Linux和Unix中,換行符是 \n。在windows中,路徑分隔符是反斜杠 \ ,例如windows系統(tǒng)下的路徑一般是"C:\windows\system32\",而Linux和Unix中,路徑分隔符是斜桿 / 。如果你寫的程序在多個(gè)平臺(tái)上都可以正常運(yùn)行,一般會(huì)怎么做呢?

看了我們昨天關(guān)于sys模塊的同學(xué)可能記得,sys模塊有一個(gè)platform函數(shù),可以輸出系統(tǒng)版本,那么這個(gè)時(shí)候就可以根據(jù)它的值,來(lái)選擇對(duì)應(yīng)的換行符和路徑分隔符。但是因?yàn)樾枰约簛?lái)判斷,還是略微有些麻煩。
作為一個(gè)程序員,當(dāng)然是要把麻煩的事情簡(jiǎn)單化,os就提供了若干個(gè)這樣的跨平臺(tái)屬性,如下所示:

  • os.sep 根據(jù)系統(tǒng)類型輸出對(duì)應(yīng)的路徑分隔符
  • os.linesep 根據(jù)系統(tǒng)類型自動(dòng)輸出對(duì)應(yīng)的換行符
  • os.pathsep 系統(tǒng)中用來(lái)分隔環(huán)境變量路徑的符號(hào)
  • os.path.join() 用于拼接路徑,并根據(jù)系統(tǒng)類型自動(dòng)返回對(duì)應(yīng)路徑分隔符分隔的路徑;
  • os.path.split() 用于切割路徑,根據(jù)系統(tǒng)類型自動(dòng)選擇對(duì)應(yīng)的分隔符來(lái)分割;

我們來(lái)看一下這幾個(gè)函數(shù)的應(yīng)用示例

# windows系統(tǒng)對(duì)應(yīng)操作符
>>> os.sep, os.linesep, os.pathsep
('\\', '\r\n', ';')

# 切割windows路徑和拼接windows路徑
>>> os.path.split('c:\windows\system32')
('c:\\windows', 'system32')
>>>
>>> os.path.join('c:\windows', 'system32')
'c:\\windows\\system32'

# Linux系統(tǒng)對(duì)應(yīng)操作符
>>> os.sep, os.linesep, os.pathsep
('/', '\n', ':')

# 切割linux路徑和拼接Linux路徑
>>> os.path.split('/root/project/module.py')
('/root/project', 'module.py')
>>> 
>>> os.path.join('/root/project', 'module.py')
'/root/project/module.py'

3. 運(yùn)行系統(tǒng)命令相關(guān)的函數(shù)

在文章的最開始,我們說(shuō),os是一個(gè)很底層的模塊,它會(huì)和系統(tǒng)提供的API或者系統(tǒng)調(diào)用進(jìn)行交互。也就是說(shuō)它可以用來(lái)對(duì)系統(tǒng)進(jìn)行管理。它是怎么做到的呢?os提供了一些函數(shù),可以讓你直接調(diào)用系統(tǒng)提供的命令,相當(dāng)于是你直接來(lái)操作系統(tǒng)一樣。如下所示:

  • os.system() 在python腳本中運(yùn)行shell命令
  • os.popen() 運(yùn)行shell命令并與其輸入流或輸出流相連接,也就是說(shuō)可以給shell命令提供輸入?yún)?shù)或者獲取它的命令執(zhí)行結(jié)果

下面我們來(lái)看一下這兩個(gè)函數(shù)的用法:
示例1. os.system運(yùn)行系統(tǒng)命令

>>> result = os.system('ls /')
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
>>> result
0

我們使用一個(gè)變量來(lái)接收命令是否正確執(zhí)行的結(jié)果。而命令執(zhí)行后的內(nèi)容會(huì)直接輸出到控制臺(tái)上。

如果我們想要把命令執(zhí)行后的內(nèi)容都收集起來(lái)呢?那么就需要用到os.popen這個(gè)函數(shù)了,用法如下:

# 所有內(nèi)容收集為一行
>>> result = os.popen('ls /').read()
>>> result
'bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsrv\nsys\ntmp\nusr\nvar\n'

# 多行內(nèi)容以列表形式返回
>>> result = os.popen('ls /').readlines()
>>> result
['bin\n', 'boot\n', 'dev\n', 'etc\n', 'home\n', 'lib\n', 'lib64\n', 'media\n', 'mnt\n', 
'opt\n', 'proc\n', 'root\n', 'run\n', 'sbin\n', 'srv\n', 'sys\n', 'tmp\n', 'usr\n', 'var\n']

上面只是演示了這樣兩個(gè)簡(jiǎn)單的示例,但是根據(jù)這樣的用法指導(dǎo),你還可以使用os的這兩個(gè)函數(shù),來(lái)調(diào)用更復(fù)雜的系統(tǒng)命令。來(lái)完成python模塊無(wú)法完成的任務(wù)。這也是為什么python被稱為 "膠水語(yǔ)言" 的原因,因?yàn)樗梢哉澈隙喾N不同樣式的命令。
在后面的內(nèi)容中,我們可能還會(huì)更加深入的介紹這個(gè)模塊的其他函數(shù),今天的內(nèi)容就是這些,如果覺得對(duì)你有幫助,可以為阿飛點(diǎn)個(gè)贊。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI