跳转至

OS 模块

1. 介绍

        在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这就依赖于os模块,所以今天整理下比较常用的几个方法。网上这方面资料也很多,每次整理,只是对自己所学的知识进行梳理,从而加深对某个模块的使用。

os.remove(‘path/filename’) 删除文件

os.rename(oldname, newname) 重命名文件

os.walk() 生成目录树下的所有文件名

os.chdir('dirname') 改变目录

os.mkdir/makedirs('dirname')创建目录/多层目录

os.rmdir/removedirs('dirname') 删除目录/多层目录

os.listdir('dirname') 列出指定目录的文件

os.getcwd() 取得当前工作目录

os.chmod() 改变目录权限

os.path.basename(‘path/filename’) 去掉目录路径,返回文件名

os.path.dirname(‘path/filename’) 去掉文件名,返回目录路径

os.path.join(path1[,path2[,...]]) 将分离的各部分组合成一个路径名

os.path.split('path') 返回( dirname(), basename())元组

os.path.splitext() 返回 (filename, extension) 元组

os.path.getatime\ctime\mtime 分别返回最近访问、创建、修改时间

os.path.getsize() 返回文件大小

os.path.exists() 是否存在

os.path.isabs() 是否为绝对路径

os.path.isdir() 是否为目录

os.path.isfile() 是否为文件

2. 当前路径

        os.getcwd():查看当前所在路径。

In [1]: import os

In [2]: os.getcwd()
Out[2]: '/root/book/books'

In [3]: os.getcwdb()
Out[3]: b'/root/book/books'

3. 列举文件

        os.listdir(path):列举目录下的所有文件。返回的是列表类型。

In [4]: os.listdir()
Out[4]: ['docs', 'README.md', 'site', '.2.21.mkdocs.yml.ok', '.git', 'mkdocs.yml']

4. 绝对路径

       os.path.abspath(path):返回path的绝对路径。

In [14]: os.path.abspath('.')
Out[14]: '/root/book/books'

In [15]: os.path.abspath('..')
Out[15]: '/root/book'

In [16]: os.path.abspath('/usr/local/src')
Out[16]: '/usr/local/src'

5. 文件名

       os.path.basename(path):返回path中的文件名。

In [18]: os.path.basename('/usr/local/src/name.txt')
Out[18]: 'name.txt'

In [19]: os.path.basename('.')
Out[19]: '.'

6. 文件父路径

        os.path.dirname(path):返回path中的文件夹部分,结果不包含'\'

In [23]: os.path.dirname('.')
Out[23]: ''

In [24]: os.path.dirname('/usr/local/src/cmz.log')
Out[24]: '/usr/local/src'

7. 文件大小

       os.path.getsize(path):文件或文件夹的大小,若是文件夹返回0。

In [39]: os.path.getsize('mkdocs.yml')
Out[39]: 13843

root@leco:~/book/books# du -sh mkdocs.yml
16K mkdocs.yml

8. 文件路径分割

       os.path.split(path):将路径分解为(文件夹,文件名),返回的是元组类型。可以看出,若路径字符串最后一个字符是/,则只有文件夹部分有值;若路径字符串中均无/,则只有文件名部分有值。若路径字符串有/,且不在最后,则文件夹和文件名均有值。且返回的文件夹的结果不包含/.

In [25]: os.path.split('/usr/local/src/cmz.log')
Out[25]: ('/usr/local/src', 'cmz.log')

In [26]: os.path.split('/opt/cmz.log')
Out[26]: ('/opt', 'cmz.log')


In [27]: os.path.split('/usr/local/src/')
Out[27]: ('/usr/local/src', '')

In [28]: os.path.split('/usr/local/src')
Out[28]: ('/usr/local', 'src')

9. 文件路径拼接

       os.path.join(path1,path2,...):将path进行组合,若其中有绝对路径,则之前的path将被删除。

In [31]: os.path.join('/a','cmz.txt')
Out[31]: '/a/cmz.txt'

In [32]: os.path.join('/a','/b','cmz.txt')
Out[32]: '/b/cmz.txt'

In [33]: os.path.join('/a','/b','/c','cmz.txt')
Out[33]: '/c/cmz.txt'

In [34]: os.path.join('/usr/local/src','cmz.txt')
Out[34]: '/usr/local/src/cmz.txt'

In [35]: os.path.join('a','b','c','cmz.txt')
Out[35]: 'a/b/c/cmz.txt'

10. 查看文件是否存在

       os.path.exists(path):文件或文件夹是否存在,返回True 或 False。

In [2]: os.path.exists('mkdocs.yml')
Out[2]: True

In [3]: os.path.exists('mkdocs2222.yml')
Out[3]: False

11. 查看时间

        os.path.getmtime(path):文件或文件夹的最后修改时间,从新纪元到访问时的秒数。

os.path.getatime(path):文件或文件夹的最后访问时间,从新纪元到访问时的秒数。

os.path.getctime(path):文件或文件夹的创建时间,从新纪元到访问时的秒数。

In [5]: ls
docs/  mkdocs.yml  README.md  site/

In [6]: os.path.getmtime('mkdocs.yml')
Out[6]: 1551450797.9045475

In [7]: os.path.getatime('mkdocs.yml')
Out[7]: 1551450803.2045667

In [8]: os.path.getctime('mkdocs.yml')
Out[8]: 1551450797.9045475

12. 创建硬链接

       创建硬链接,名为参数 dst,指向参数 src

In [18]: pwd
Out[18]: '/tmp/cmz'

In [19]: ls
hosts

In [20]: os.link('hosts','mylink_hosts')

In [21]: ls
hosts  mylink_hosts

In [22]: ll
总用量 8
-rw-r--r-- 2 root 369 3月   2 22:48 hosts
-rw-r--r-- 2 root 369 3月   2 22:48 mylink_hosts

13. 创建软链接

       

In [21]: ls
myhosts  mylink_hosts  new_cmz/

In [22]: os.symlink('myhosts','mysoftlink_hosts')

In [23]: ll
总用量 12
-rw-r--r-- 2 root  369 3月   2 22:48 myhosts
-rw-r--r-- 2 root  369 3月   2 22:48 mylink_hosts
lrwxrwxrwx 1 root    7 3月   2 23:02 mysoftlink_hosts -> myhosts
drwxr-xr-x 3 root 4096 3月   2 22:50 new_cmz/

14. 重命名文件或者目录

        os.rename(src, dst),重命名文件或目录,从 src 到 dst

In [10]: ls
cmz1/  hosts  mylink_hosts

In [11]: os.rename('hosts','myhosts')

In [12]: ls
cmz1/  myhosts  mylink_hosts

In [13]: os.rename('cmz1','new_cmz')

In [14]: ls
myhosts  mylink_hosts  new_cmz/

15. 改变路径

        改变当前工作目录

In [24]: pwd
Out[24]: '/tmp/cmz'

In [25]: ls
myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

In [26]: os.chdir('new_cmz')

In [27]: pwd
Out[27]: '/tmp/cmz/new_cmz'

In [28]: ls
cmz2/

16. cpu个数

In [36]: os.cpu_count()
Out[36]: 4

17. 公共部分

        以"/"分割,将路径分成几部分,找到公共的这一个部分。

In [41]: name = ['/a/b/cmz1.txt','/a/b/cmz2.txt','/a/b/cmz3.txt']

In [42]: os.path.commonpath(name)
Out[42]: '/a/b'

In [43]: name = ['/a/cmz1.txt','/b/cmz2.txt','/c/cmz3.txt']

In [44]: os.path.commonpath(name)
Out[44]: '/'

In [45]: name = ['/a/b/c/cmz1.txt','/a/b/d/cmz2.txt','/a/b/m/cmz3.txt']

In [46]: os.path.commonpath(name)
Out[46]: '/a/b'

18. 判断是否是文件

       

In [52]: os.path.isfile('myhosts')
Out[52]: True

In [53]: os.path.isfile('new_cmz')
Out[53]: False

19. 判断是否是文件夹

        返回true或者false

In [48]: ls
myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

In [49]: os.path.isdir('myhosts')
Out[49]: False

In [50]: os.path.isdir('new_cmz')
Out[50]: True

20. 判断是否是文件夹

        判断是否 是软连接

In [54]: ls
myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

In [55]: os.path.islink('myhosts')
Out[55]: False

In [56]: os.path.islink('mylink_hosts')
Out[56]: False

In [57]: os.path.islink('mysoftlink_hosts')
Out[57]: True

21. 生成单级目录

In [92]: ls
a/  myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

In [93]: os.mkdir('test1')

In [94]: ls
a/  myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/  test1/

22. 生成多级目录

        类似mkdir -p a/b/c

In [76]: os.makedirs('a/b/c')

In [77]: ls
a/  myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

In [78]: ls a/b/c

In [79]: ls a/b
c/

23. 删单级空目录

        删除单级空目录,若目录不为空则无法删除,报错

In [102]: os.mkdir('test')

In [103]: ls
a/  myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/  test/

In [105]: ls a
b/

In [106]: os.rmdir('a')
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-106-00cb998d57ad> in <module>()
----> 1 os.rmdir('a')

OSError: [Errno 39] Directory not empty: 'a'

In [107]: os.rmdir('test')

In [108]: ls
a/  myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

24. 删单文件

        删除一个文件。删除非文件就报错

In [111]: ls
a/  myhosts  mylink_hosts  mysoftlink_hosts@  new_cmz/

In [112]: os.remove('myhosts','mysoftlink_hosts')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-112-985bdc8d4d7f> in <module>()
----> 1 os.remove('myhosts','mysoftlink_hosts')

TypeError: Function takes at most 1 positional arguments (2 given)

In [113]: os.remove('mysoftlink_hosts')

In [114]: ls
a/  myhosts  mylink_hosts  new_cmz/

25. 分离文件名和扩展名

In [123]: os.path.splitext('cmz.log')
Out[123]: ('cmz', '.log')

In [124]: os.path.splitext('/usr/local/src/cmz.log')
Out[124]: ('/usr/local/src/cmz', '.log')

26. 操作系统特定路径分隔符

        win下为"\",Linux下为"/"

In [115]: os.sep
Out[115]: '/'

27. 操作系统终止符

        输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

In [116]: os.linesep
Out[116]: '\n'

28. 分割路径的符

        win下为; , Linux下为:

In [117]: os.pathsep
Out[117]: ':'

29. 系统环境变量

In [120]: os.environ
Out[120]: environ({'SHELL': '/bin/bash', 'TERM': 'xterm', 'JRE_HOME': '/usr/lib/jvm/jdk1.8.0_40/jre', 'USER':'root', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:','SUDO_USER': 'leco', 'SUDO_UID': '1000', 'USERNAME': 'root', 'MAIL': '/var/mail/root', 'PATH': '/usr/lib/jvm/jdk1.8.0_40/bin:/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games', 'PWD': '/root', 'JAVA_HOME': '/usr/lib/jvm/jdk1.8.0_40', 'LANG': 'zh_CN.UTF-8', 'SHLVL': '1','SUDO_COMMAND': '/bin/su', 'HOME': '/root', 'LANGUAGE': 'zh_CN:zh', 'LOGNAME': 'root', 'CLASSPATH': '.:/usr/lib/jvm/jdk1.8.0_40/lib:/usr/lib/jvm/jdk1.8.0_40/jre/lib', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'SUDO_GID': '1000', 'DISPLAY': 'localhost:10.0', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', '_': '/usr/local/bin/ipython', 'OLDPWD': '/root/book/books'})

30. 运行shell

       运行shell命令,直接显示

In [121]: os.system('ls')
a  myhosts  mylink_hosts  new_cmz
Out[121]: 0

In [122]: os.system('uptime')
 23:37:50 up 3 days, 14:28,  3 users,  load average: 0.15, 0.19, 0.17
Out[122]: 0

31. 文件四大权限

  • os.F_OK 作为access()的mode参数,测试path是否存在.
  • os.R_OK 包含在access()的mode参数中 , 测试path是否可读.
  • os.W_OK 包含在access()的mode参数中 ,测试path是否可写.
  • os.X_OK 包含在access()的mode参数中 ,测试path是否可执行.
In [130]: ls
a/  myhosts  mylink_hosts  new_cmz/

In [131]: os.access('myhosts',os.F_OK)
Out[131]: True

In [132]: os.access('myhosts',os.R_OK)
Out[132]: True

In [133]: os.access('myhosts',os.W_OK)
Out[133]: True

In [134]: os.access('myhosts',os.X_OK)
Out[134]: False