• day5-os、sys模块


    一.概述

    开发运维相关支撑系统现今已成为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下为" ",Linux下为" "
        1 >>> import os
        2 >>> os.linesep
        3 '
      '
    • 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:UsersMaxwell 的目录
        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)。

  • 相关阅读:
    Leetcode: Increasing Triplet Subsequence
    Snapchat面经(师兄的)
    M面经prepare: Shuffle a deck
    M面经Prepare: Find integer Average of 2 integers.
    M面经Prepare: Positive-Negative partitioning preserving order
    M面经Prepare: Delete Words Starting With One Character
    Lintcode: Subtree
    Leetcode: Reconstruct Itinerary
    Groupon面经:Find paths in a binary tree summing to a target value
    一些小感悟(2014.04版)
  • 原文地址:https://www.cnblogs.com/linupython/p/8486178.html
Copyright © 2020-2023  润新知