1. 程式人生 > 實用技巧 >python 內建模組os 和 sys

python 內建模組os 和 sys

Python中大多數系統級介面都集中在兩個模組: sys和os———《Programming Python》

一、OS模組

用於提供系統級別的操作。

OS
目錄和檔案
os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推

os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
os.remove() 刪除一個檔案
os.rename("oldname","newname") 重新命名檔案/目錄
os.stat('path/filename') 獲取檔案/目錄資訊

路徑相關
os.path.abspath(path) 返回path規範化的絕對路徑

os.path.split(path) 將path分割成目錄和檔名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間
os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間

系統相關
os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用於分割檔案路徑的字串
os.name 輸出字串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command") 執行shell命令,直接顯示
os.environ 獲取系統環境變數

1.

os.path.isdir,
os.path.isfile,
os.exists,
os.path.getsize
顧名思義,這是用來檢視路徑/檔案是否存在的,getsize可以獲取檔案大小(kb)

>>> import os
>>> os.path.isdir(r'F:\python程式')  #如果path是一個存在的目錄,則返回True。否則返回False
True
>>> os.path.getsize(r'F:\python程式')#返回資料夾"F:\python程式"的大小
12288 
>>> os.path.exists(r'F:\python程式\匯入路徑研究')#如果path存在,返回True;如果path不存在,返回False 
True 

>>> os.path.isfile(r'F:\python程式\匯入路徑研究\test.py')#如果path是一個存在的檔案,返回True。否則返回False 
True 

>>>

  1. os.path.split
  2. os.path.join
  3. os.path.dirname
  4. os.path.basename
  5. 這些方法主要是對一個路徑進行具體處理,預設按照dirname, basename的方式進行分解或組合
  6. >>> os.path.split(r'F:\python程式\匯入路徑研究\test.py')#將path分割成目錄和檔名二元組返回
    ('F:\\python程式\\匯入路徑研究', 'test.py')
    >>> a=os.path.split(r'F:\python程式\匯入路徑研究\test.py')
    >>> print(a)
    ('F:\\python程式\\匯入路徑研究', 'test.py')
    >>> os.path.join(*a)  #將多個路徑組合後返回
    'F:\\python程式\\匯入路徑研究\\test.py'
    >>> file_loc=r'F:\python程式\匯入路徑研究\test.py'
    >>> os.path.dirname(file_loc)#返回path的目錄。
    'F:\\python程式\\匯入路徑研究'
    >>> os.path.basename(file_loc)#返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。
    'test.py'

    可以看出:os.path.split與os.path.join是正好相反的功能,一個是分割,一個是組合

    >>> pathname=r'F:\python程式\匯入路徑研究\test.py'
    >>> pathname.split(os.sep)
    ['F:', 'python程式', '匯入路徑研究', 'test.py']
    >>> os.sep.join(pathname.split(os.sep))
    'F:\\python程式\\匯入路徑研究\\test.py'

    ############os.sep的用法###########

    python是跨平臺的。在Windows上,檔案的路徑分隔符是'\',在Linux上是'/'。
    為了讓程式碼在不同的平臺上都能執行,那麼路徑應該寫'\'還是'/'呢?
    使用os.sep的話,就不用考慮這個了,os.sep根據你所處的平臺,自動採用相應的分隔符號。

    3.注意os模組下的os.path.normpath也很好用,可以用來規範一個路徑
    >>> os.path.normpath('F:\python程式\匯入路徑研究\test.py')
    'F:\\python程式\\匯入路徑研究\test.py'

    4.os.path.abspath根據傳入的相對/絕對路徑返回對應的絕對路徑

     1 import os
     2 
     3 print(os.path.abspath("."))   #當前目錄的絕對路徑
     4 print(os.path.abspath(r"."))
     5 
     6 print(os.path.abspath(".."))
     7 print(os.path.abspath(r".."))  #上級目錄的絕對路徑
     8 
     9 
    10 print(os.path.abspath(r"F:/python程式/匯入路徑研究/abspath功能.py"))
    11 print(os.path.abspath(r"F:/python程式/匯入路徑研究/abspath功能.py"))

    從輸出結果看不出引數"r"的功能


二、SYS模組
用於提供對直譯器相關的操作

sys.argv 命令列引數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0),異常為exit(1)
sys.version 獲取Python解釋程式的版本資訊
sys.maxint 最大的Int值
sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回作業系統平臺名稱
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

1.相對路徑和絕對路徑

絕對路徑就是檔案的真正儲存的路徑,如:C:\Users\lenovo\Desktop

相對路徑就是以當前檔案為基準一級級目錄指向被引用的資原始檔。
以下是常用的表示當前目錄和當前目錄的父級目錄的識別符號
  
../ 表示當前檔案所在的目錄的上一級目錄
./ 表示當前檔案所在的目錄(可以省略)
/ 表示當前站點的根目錄(域名對映的硬碟目錄)

1 import os
2 path1=os.path.abspath('.')   # 表示當前所處的資料夾的絕對路徑
3 print(path1)
4 path2=os.path.abspath('..')  # 表示當前所處的資料夾上一級資料夾的絕對路徑
5 print(path2)

結果如下:

>>> 
==================== RESTART: F:/python程式/匯入路徑研究/listdir.py ===================
F:\python程式\匯入路徑研究
F:\python程式
>>> 

2.Python sys.path的使用

sys.path模組是動態的修改系統路徑

因為模組要處於Python搜尋路徑中的目錄裡才能被匯入,(但我們不喜歡維護一個永久性的大目錄,因為其他所有的Python指令碼和應用程式匯入模組的時候效能都會被拖累。)因此當某一目錄存在而且此前不在sys.path時,我們可以用sys.path動態地在路徑中新增一個"目錄"。

sys.path是個列表,所以在末尾新增目錄是很容易的,用sys.path.append就行了。當這個append執行完之後,新目錄即時起效,以後的每次import操作都可能會檢查這個目錄。當然我們也可以選擇用sys.path.insert(0,…,這樣新新增的目錄會優先於其他目錄被import檢查。

   sys.path.append(‘你的模組路徑名稱’)。

   sys.path.insert(0,’模組的名稱’)

新增相關的路徑,但在退出python環境後自己新增的路徑就會自動消失!

1 import sys
2 sys.path.append('F:\python程式\匯入路徑研究')   #sys.path是個列表,用sys.path.append可以在末尾新增目錄。

1 import sys
2 sys.path.insert(0,'F:\python程式\匯入路徑研究')#用sys.path.insert新新增的目錄會優先於其他目錄被import檢查到。

3.python 在不同層級目錄import 模組的方法

有一個資料夾/home/a, 裡面有個模組叫b.py, 我怎麼把他import到程式裡?

方法一:  

import sys;
sys.path.append(“/home/a/”)
import b

方法二:

  在目錄裡面增加__init__.py檔案,裡面可以寫import時執行的程式碼,當然也可以留空就可以.
import home.a.b

方法三:

from home.a.b import *
  前提 home、a中都包括__init__.py 即:要匯入的檔案的當前目錄和父目錄都要有init.py檔案

Python包含子目錄中的模組方法比較簡單,關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。
下面將具體介紹幾種常用情況:

(1)主程式與模組程式在同一目錄下:

如下面程式結構:
– src
  |– mod1.py
  |– test1.py

  若在程式test1.py中匯入模組mod1, 則直接使用import mod1或from mod1 import *;

(2)主程式所在目錄是模組所在目錄的父(或祖輩)目錄
如下面程式結構:
– src
|– mod1.py
|– mod2
  | – mod2.py
– test1.py

  若在程式test1.py中匯入模組mod2, 需要在mod2資料夾中建立空檔案__init__.py檔案(也可以在該檔案中自定義輸出模組介面); 然後使用 from mod2.mod2 import * 或import mod2.mod2.

(3)主程式匯入上層目錄中模組或其他目錄(平級)下的模組
如下面程式結構:
– src
  |– mod1.py
  |– mod2
   |– mod2.py
  |– sub
    | – test2.py
  – test1.py
  若在程式test2.py中匯入模組mod1.py和mod2.py。首先需要在mod2下建立__init__.py檔案(同(2)),src下不必建立該檔案。然後呼叫方式如下:
  下面程式執行方式均在程式檔案所在目錄下執行,如test2.py是在cd sub;之後執行python test2.py
而test1.py是在cd src;之後執行python test1.py; 不保證在src目錄下執行python sub/test2.py成功。
import sys
sys.path.append(“..”)
import mod1
import mod2.mod2

總結:

  當要匯入的檔案和當前檔案在同一個目錄時,可以直接匯入這個檔案。

  當要匯入的檔案或者目錄和當前檔案不在同一目錄時,需要先跳到要匯入檔案的父級目錄(即將父級目錄加入系統路徑),然後一級一級的用點號連線走過的目錄或者檔案,直到到達要匯入的模組。