1. 程式人生 > >day5-os、sys模塊

day5-os、sys模塊

一級目錄 版本 操作 BE amd64 rec number 分隔 shu

一.概述

開發運維相關支撐系統現今已成為Devops下的一大熱門領域,Python在這方面也有著自己獨到的優勢。這類場景以及其他一些場景下,需要調用一些操作系統的接口,這就涉及到今天要講述的OS模塊和sys模塊。

二.OS模塊的常見用法

  • os.getcwd()
    獲取當前工作目錄。需要註意的是目錄的分隔符,windows下是’\\’(有一個轉義符),linux下是‘/’
      1 >>> import os
      2 >>> os.getcwd()
      3 ‘C:\\Users\\Beyondi‘
  • os.chdir(‘dirname’)
    改變當前工作目錄
      1 >>> import
    os 2 >>> os.getcwd() 3 ‘C:\\Users\\Beyondi‘ 4 >>> os.chdir(‘d:\\python‘) 5 >>> os.getcwd() 6 ‘d:\\python‘
  • os.curdir
    返回當前目錄點號
      1 >>> import os
      2 >>> os.curdir
      3 ‘.‘
  • os.pardir
    返回當前目錄的父目錄字符串’..’
      1 >>> import os
      2 >>> os.pardir
      3
    ‘..‘
  • os.makedirs(‘dirname1/dirname2‘)
    生成單層或多層遞歸目錄
      1 >>> import os
      2 >>> os.listdir(‘D:\\iTudou‘)
      3 [‘下載‘, ‘轉碼‘]
      4 >>> os.makedirs(‘D:\\iTudou\\test\\001‘)
      5 >>> os.listdir(‘D:\\iTudou‘)
      6 [‘test‘, ‘下載‘, ‘轉碼‘]
      7 >>> os.listdir(‘D:\\iTudou\\test‘)
      8
    [‘001‘]
    註意這裏有一個前提是具有相應的權限去創建目錄,否則會提示拒絕訪問之類的錯誤。
  • os.removedirs(”dirname”)
    往上層遞歸刪除空目錄,若dirname目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推
      1 >>> import os
      2 >>> os.listdir(‘d:\\iTudou‘)
      3 [‘test‘, ‘test2‘, ‘下載‘, ‘轉碼‘]
      4 >>> os.listdir(‘d:\\iTudou\\test‘)
      5 [‘001‘]
      6 >>> os.listdir(‘d:\\iTudou\\test\\001‘)
      7 []
      8 >>> os.removedirs(‘d:\\iTudou\\test\\001‘)
      9 >>> os.listdir(‘d:\\iTudou\\test\\001‘)
     10 Traceback (most recent call last):
     11   File "<stdin>", line 1, in <module>
     12 FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: ‘d:\\iTudou\\test\\001‘
     13 >>> os.listdir(‘d:\\iTudou\\test‘)
     14 Traceback (most recent call last):
     15   File "<stdin>", line 1, in <module>
     16 FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: ‘d:\\iTudou\\test‘
     17 >>> os.listdir(‘d:\\iTudou‘)
     18 [‘test2‘, ‘下載‘, ‘轉碼‘]
     19 >>> os.removedirs(‘d:\\iTudou\\test2‘)
     20 >>> os.listdir(‘d:\\iTudou‘)
     21 [‘下載‘, ‘轉碼‘]
     22 >>>
    慎用該命令,雖然刪除的是空目錄,但是會向上遞歸,功能太過強大,且有些反人類設計了!
    如果要遞歸刪除非空目錄,還是用shutil.rmtree(path)這個神器把,更符合rm -rf的思路。
  • os.mkdir
    生成單級目錄,相當於linux中的mkdir
      1 >>> import os
      2 >>> os.listdir(‘d:\\iTudou‘)
      3 [‘下載‘, ‘轉碼‘]
      4 #最後一層目錄的父目錄必須已經存在,否則要一級一級去創建
      5 >>> os.mkdir(‘d:\\iTudou\\test\\001‘)
      6 Traceback (most recent call last):
      7   File "<stdin>", line 1, in <module>
      8 FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: ‘d:\\iTudou\\test\\001‘
      9 >>> os.mkdir(‘d:\\iTudou\\test‘)
     10 >>> os.listdir(‘d:\\iTudou‘)
     11 [‘test‘, ‘下載‘, ‘轉碼‘]
  • os.rmdir
    刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
      1 >>> import os
      2 >>> os.listdir(‘d:\\iTudou\\test‘)
      3 []
      4 >>> os.makedirs(‘d:\\iTudou\\test2\\001‘)
      5 >>> os.listdir(‘d:\\iTudou\\test2‘)
      6 [‘001‘]
      7 >>> os.rmdir(‘d:\\iTudou\\test‘)
      8 >>> os.rmdir(‘d:\\iTudou\\test2‘)
      9 Traceback (most recent call last):
     10   File "<stdin>", line 1, in <module>
     11 OSError: [WinError 145] 目錄不是空的。: ‘d:\\iTudou\\test2‘
  • os.listdir(‘dirname‘)
    列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印
      1 >>> import os
      2 >>> os.listdir(‘c:\\users‘)
      3 [‘All Users‘, ‘Beyondi‘, ‘Default‘, ‘Default User‘, ‘desktop.ini‘, ‘Public‘]
  • os.remove()
    刪除一個文件
      1 >>> import os
      2 >>> os.listdir(‘D:\\iTudou\\test2‘)
      3 [‘1.txt‘]
      4 >>> os.remove(‘D:\\iTudou\\test2\\1.txt‘)
      5 >>> os.listdir(‘D:\\iTudou\\test2‘)
      6 []
  • os.rename(‘oldname’,’newname’)
    重命名一個文件或目錄
      1 >>> import os
      2 >>> os.listdir(‘D:\\iTudou\\test2‘)
      3 [‘1.txt‘]
      4 >>> os.remove(‘D:\\iTudou\\test2\\1.txt‘)
      5 >>> os.listdir(‘D:\\iTudou\\test2‘)
      6 []
      7 >>> import os
      8 >>> os.listdir(‘D:\\iTudou\\test2‘)
      9 [‘002.txt‘]
     10 >>> os.rename(‘D:\\iTudou\\test2\\002.txt‘,‘D:\\iTudou\\test2\\001.txt‘)
     11 >>> os.listdir(‘D:\\iTudou\\test2‘)
     12 [‘001.txt‘]
     13 >>> os.rename(‘D:\\iTudou\\test2‘,‘D:\\iTudou\\test1‘)
     14 >>> os.listdir(‘D:\\iTudou‘)
     15 [‘test1‘, ‘下載‘, ‘轉碼‘]
     16 >>>
  • os.stat(‘path/filename‘)
    獲取文件/目錄信息
      1 >>> import os
      2 >>> os.stat(‘D:\\iTudou\\test1‘)
      3 os.stat_result(st_mode=16895, st_ino=12384898975275303, st_dev=1716593648, st_nl
      4 ink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519773509, st_mtime=1519773509,
      5 st_ctime=1519769974)
      6 >>> os.stat(‘D:\\iTudou\\test1\\001.txt‘)
      7 os.stat_result(st_mode=33206, st_ino=2251799813691689, st_dev=1716593648, st_nli
      8 nk=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519773430, st_mtime=1519773430, s
      9 t_ctime=1519773430)
     10 >>> os.stat(‘D:\\iTudou‘)
     11 os.stat_result(st_mode=16895, st_ino=9851624184877368, st_dev=1716593648, st_nli
     12 nk=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519773535, st_mtime=1519773535, s
     13 t_ctime=1483872753)
     14 >>>
    從上述示例程序可看出,os.stat可以的st_mode可以區分文件和目錄,只是相關的輸出可讀性不好。
  • os.sep
    輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
      1 >>> import os
      2 >>> os.sep
      3 ‘\\‘
  • os.linesep
    輸出當前平臺使用的行終止符,win下為"\r\n",Linux下為"\n"
      1 >>> import os
      2 >>> os.linesep
      3 ‘\r\n‘
  • os.path.sep
    輸出用於分割文件路徑的字符串
      1 >>> os.path.sep
      2 ‘\\‘
  • os.name 輸出字符串指示當前使用平臺。win->‘nt‘; Linux->‘posix‘
      1 >>> import os
      2 >>> os.name
      3 ‘nt‘
  • os.system("bash command")
    運行shell命令並返回結果
      1 >>> import os
      2 >>> os.system(‘dir‘)
      3  驅動器 C 中的卷是 Windows7_OS
      4  卷的序列號是 1A68-A0E3
      5 
      6  C:\Users\Maxwell 的目錄
      7 
      8 2018/01/24  14:23    <DIR>          .
      9 2018/01/24  14:23    <DIR>          ..
     10 2017/08/18  11:29                49 .bash_history
  • os.environ
    獲取系統環境變量
      1 >>> import os
      2 >>> os.environ
      3 environ({‘ALLUSERSPROFILE‘: ‘C:\\ProgramData‘, ‘APPDATA‘: ‘C:\\Users\\Maxwell\\A
      4 ppData\\Roaming‘, ‘COMMONPROGRAMFILES‘: ‘C:\\Program Files\\Common Files‘, ‘COMM
      5 ONPROGRAMFILES(X86)‘: ‘C:\\Program Files (x86)\\Common Files‘, ‘COMMONPROGRAMW64
      6 32‘: ‘C:\\Program Files\\Common Files‘, ‘COMMPATH‘: ‘C:\\Program Files\\Lenovo\  7 Communications Utility‘, ‘COMPUTERNAME‘: ‘MAXWELL-PC‘, ‘COMSPEC‘: ‘C:\\windows\  8 system32\\cmd.exe‘, ‘CONFIGSETROOT‘: ‘C:\\windows\\ConfigSetRoot‘, ‘FP_NO_HOST_C
      9 HECK‘: ‘NO‘, ‘HOMEDRIVE‘: ‘C:‘, ‘HOMEPATH‘: ‘\\Users\\Maxwell‘, ‘LOCALAPPDATA‘:
     10 ‘C:\\Users\\Maxwell\\AppData\\Local‘, ‘LOGONSERVER‘: ‘\\\\MAXWELL-PC‘, ‘NUMBER_O
     11 F_PROCESSORS‘: ‘4‘, ‘OS‘: ‘Windows_NT‘, ‘PATH‘: ‘C:\\ProgramData\\Oracle\\Java\ 12 javapath;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel 13 \iCLS Client\\;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C: 14 \windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\In
     15 tel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Mana
     16 gement Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Managemen
     17 t Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Co
     18 mponents\\IPT;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Pro
     19 gram Files\\Lenovo\\Fingerprint Manager Pro\\;C:\\Program Files (x86)\\Common Fi
     20 les\\Lenovo;C:\\ProgramData\\Lenovo\\ReadyApps;C:\\Program Files\\Git\\cmd;C:\\P
     21 rogram Files\\TortoiseGit\\bin;C:\\Program Files (x86)\\MobaXterm.Pro.9.3\\MobaX
     22 term_v9.3;C:\\Program Files (x86)\\SecureCRT6.2.0.195;C:\\Program Files (x86)\\S
     23 ecureCRT V6.5.8.380;C:\\Program Files (x86)\\SecureCRTSecureFX_HH_x64_7.0.0.326 24 \App\\VanDyke Clients;C:\\Program Files\\VanDyke Software\\SecureCRT;C:\\Program
     25  Files\\Java\\jdk1.8.0_60\\bin;C:\\Program Files\\Intel\\WiFi\\bin\\;C:\\Program
     26  Files\\Common Files\\Intel\\WirelessCommon\\;C:\\Program Files (x86)\\python3.6
     27 .1\\Scripts\\;C:\\Program Files (x86)\\python3.6.1\\;C:\\Program Files\\Intel\\W
     28 iFi\\bin\\;C:\\Program Files\\Common Files\\Intel\\WirelessCommon\\‘, ‘PATHEXT‘:
     29  ‘.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC‘, ‘PROCESSOR_ARCHITECTUR
     30 E‘: ‘AMD64‘, ‘PROCESSOR_IDENTIFIER‘: ‘Intel64 Family 6 Model 78 Stepping 3, Genu
     31 ineIntel‘, ‘PROCESSOR_LEVEL‘: ‘6‘, ‘PROCESSOR_REVISION‘: ‘4e03‘, ‘PROGRAMDATA‘:
     32 ‘C:\\ProgramData‘, ‘PROGRAMFILES‘: ‘C:\\Program Files‘, ‘PROGRAMFILES(X86)‘: ‘C:
     33 \\Program Files (x86)‘, ‘PROGRAMW6432‘: ‘C:\\Program Files‘, ‘PROMPT‘: ‘$P$G‘, ‘
     34 PSMODULEPATH‘: ‘C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\‘, ‘PUB
     35 LIC‘: ‘C:\\Users\\Public‘, ‘READYAPPS‘: ‘C:\\ProgramData\\Lenovo\\ReadyApps‘, ‘S
     36 ESSIONNAME‘: ‘Console‘, ‘SWSHARE‘: ‘C:\\SWSHARE‘, ‘SYSTEMDRIVE‘: ‘C:‘, ‘SYSTEMRO
     37 OT‘: ‘C:\\windows‘, ‘TEMP‘: ‘C:\\Users\\Maxwell\\AppData\\Local\\Temp‘, ‘TMP‘: ‘
     38 C:\\Users\\Maxwell\\AppData\\Local\\Temp‘, ‘TVT‘: ‘C:\\Program Files (x86)\\Leno
     39 vo‘, ‘TVTCOMMON‘: ‘C:\\Program Files (x86)\\Common Files\\Lenovo‘, ‘USERDOMAIN‘:
     40  ‘Maxwell-PC‘, ‘USERNAME‘: ‘Maxwell‘, ‘USERPROFILE‘: ‘C:\\Users\\Maxwell‘, ‘WIND
     41 IR‘: ‘C:\\windows‘, ‘WINDOWS_TRACING_FLAGS‘: ‘3‘, ‘WINDOWS_TRACING_LOGFILE‘: ‘C:
     42 \\BVTBin\\Tests\\installpackage\\csilogfile.log‘})
  • os.path.abspath(path)
    返回path規範化的絕對路徑
      1 >>> import os
      2 >>> os.path.abspath(‘.‘)
      3 ‘C:\\Users\\Maxwell‘
  • os.path.split(path)
    將path分割成目錄和文件名二元組返回,最後一級不管為目錄還是具體的文件都作為文件名,前面的路徑作為路徑
      1 >>> import os
      2 >>> os.path.split(‘C:\\Users\\Maxwell\\CMB\\PB40‘)
      3 (‘C:\\Users\\Maxwell\\CMB‘, ‘PB40‘)
      4 >>> os.path.isdir(‘C:\\Users\\Maxwell\\CMB\\PB40‘)
      5 True
      6 >>>
  • os.path.dirname(path)
    返回path的目錄,如果path是相對路徑,也返回相對路徑,如果path是絕對路徑,也返回絕對路徑
      1 >>> import os
      2 >>> os.path.dirname(‘.‘)
      3 ‘‘
      4 >>> os.getcwd()
      5 ‘C:\\Users\\Maxwell‘
      6 >>> os.path.dirname(‘C:\\Users\\Maxwell‘)
      7 ‘C:\\Users‘
  • os.path.basename(path)
    返回path最後的文件名。如何path以/或\結尾,那麽就會返回空值。即os.path.split(path)的第二個元素
      1 >>> import os
      2 >>> os.path.basename(‘C:\\Users\\Beyondi‘)
      3 ‘Beyondi‘
      4 >>> os.path.basename(‘C:\\Users\\Beyondi\\test.txt‘)
      5 ‘test.txt‘
  • os.path.exists(path)
    如果path存在,返回True;如果path不存在,返回False
      1 >>> import os
      2 >>> os.path.exists(‘C:\\Users\\Beyondi‘)
      3 True
      4 >>> os.path.exists(‘C:\\Users\\Beyondi007‘)
      5 False
  • os.path.isabs(path)
    如果path是絕對路徑,返回True.註意這裏只是從形式上判斷,不存在的目錄不會報錯
      1 >>> import os
      2 >>> os.path.isabs(‘.‘)
      3 False
      4 >>> os.path.isabs(‘C:\\Users\\Beyondi‘)
      5 True
      6 >>> os.path.isabs(‘C:\\Users\\Beyondi007‘)
      7 True
      8 >>> os.path.exists(‘C:\\Users\\Beyondi007‘)
      9 False
  • os.path.isfile(path)
    如果path是一個存在的文件,返回True。否則返回False
      1 >>> import os
      2 >>> os.path.isfile(‘C:\\Users\\Beyondi‘)
      3 False
      4 >>> os.path.isfile(‘C:\\Users\\Beyondi\\test.txt‘)
      5 True
      6 >>> os.path.isfile(‘C:\\Users\\Beyondi\\test007.txt‘)
      7 False
  • os.path.isdir(path)
    如果path是一個存在的目錄,則返回True。否則返回False
      1 >>> import os
      2 >>> os.path.isdir(‘.‘)
      3 True
      4 >>> os.path.isdir(‘C:\\Users\\Beyondi‘)
      5 True
      6 >>> os.path.isdir(‘C:\\Users\\Beyondi007‘)
      7 False
      8 >>> os.path.isdir(‘C:\\Users\\Beyondi\\test.txt‘)
      9 False
  • os.path.join(path1, path2[, ...]]) 將多個路徑(文件名)組合後返回,這裏僅僅是完成拼接而已,不會判斷路徑或文件的真實存在性。
      1 >>> import os
      2 >>> os.path.join(‘C:\\Users\\Beyondi‘,‘001‘,‘002‘)
      3 ‘C:\\Users\\Beyondi\\001\\002‘
      4 >>> os.path.join(‘000‘,‘001‘,‘002‘)
      5 ‘000\\001\\002‘
      6 >>> os.path.join(‘0.txt‘,‘1.txt‘,‘2.txt‘)
      7 ‘0.txt\\1.txt\\2.txt‘
  • os.path.getatime(path)
    返回path所指向的文件或者目錄的最後存取時間
  • os.path.getmtime(path)
    返回path所指向的文件或者目錄的最後修改時間
      1 >>> import os
      2 >>> os.path.getatime(‘C:\\Users\\Beyondi‘)
      3 1515454528.3171692
      4 >>> os.path.getmtime(‘C:\\Users\\Beyondi‘)
      5 1515454528.3171692
    這裏的時間,可讀性不好…

三.sys模塊的常見用法

  • sys.argv 命令行參數List,第一個元素是程序本身路徑
  • sys.exit(n) 退出程序,正常退出時exit(0)
  • sys.version
    獲取Python解釋程序的版本信息
      1 >>> import sys
      2 >>> sys.version
      3 ‘3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]‘
  • sys.path
    返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
      1 >>> import sys
      2 >>> sys.path
      3 [‘‘, ‘C:\\Program Files (x86)\\python3.6.1\\python36.zip‘, ‘C:\\Program Files (x
      4 86)\\python3.6.1\\DLLs‘, ‘C:\\Program Files (x86)\\python3.6.1\\lib‘, ‘C:\\Progr
      5 am Files (x86)\\python3.6.1‘, ‘C:\\Program Files (x86)\\python3.6.1\\lib\\site-p
      6 ackages‘]
  • sys.platform 返回操作系統平臺名稱,不太準確
  • sys.stdout.write(‘please:‘)
    控制臺上行打印字符串和長度
      1 >>> import sys
      2 >>> sys.stdout.write(‘please:‘)
      3 please:7
      4 
  • val = sys.stdin.readline()[:-1]
    通過變量存儲標準輸入的字符串
      1 >>> import sys
      2 >>> val = sys.stdin.readline()[:-1]
      3 asdf
      4 >>> print(val)
      5 asdf

四.總結

總結來看,os和sys模塊的功能有限,如果要實現文件和系統層面較為復雜的功能,還需要借助其他模塊(如shutil)。

day5-os、sys模塊