Python之OS模块【一】

0 前言

学习了一定的python语言基础后,我们开始学习一些Python标准库中的常用模块。本次介绍OS模块。OS模块主要用于程序与操作系统之间的交互。 OS模块使得我们能用相同的代码与不同的操作系统交互。因为OS模块帮我们透明化了不同操作系统的差异。比如我们可使用os.path中的方法对操作系统进行路径操作,不用担心window、linux、mac操作系统路径语法的差异。 os.path这个对象其实是根据不同操作系统导入了不同的路径操作模块(ntpath.py、posixpath.py)

这段os.py中的源码展示了如何根据不同的操作系统,执行 improt ntpath as path还是import posixpath as path,这样对我们来说,不管是linux还是window,我们只要使用path就可以了。os模块正是通过这种方式统一了接口。

这篇文章先来讲解os模块中os.path的使用。

1 os.path

os.path模块对路径操作实现一些有用的功能。

1.1 导入os模块

os.path是通过os模块来导入的。像之前解释的,os.path本质上是ntpath或者posixpath模块,只不过os模块中帮我们导入了ntpath或者posixpath模块。

在代码中输入下面的代码导入模块:

1
import os

此外,为了方便演示,我在我的project文件中先创建了一些文件路径:

我用来演示的py文件名为os_test.py。

创建了文件路径后,我们在代码中定义一个字符串变量path来表示这个路径

1
2
#  演示用的路径
path = "aaa/bbb/ccc/ddd.py"

1.2 常用函数介绍

接下来介绍os.path中常用的函数。想全面的了解,最好的办法还是阅读源码和官方文档。

源码:可以在pychram中打开源码查看

官方文档:https://docs.python.org/3/library/os.path.html

一些翻译成中文的文档:

  • https://yiyibooks.cn/xx/python_352/index.html;
  • https://www.rddoc.com/doc/Python/3.6.0/zh/library/os.path/

exists(path)

exists函数判断path是否存在。返回bool类型。

1
2
print(os.path.exists(path))
print(os.path.exists("/aaa/bbb/ccc"))

运行结果:

1
2
True
False

abspath(path)

abspath函数返回一个标准的path路径的绝对路径。

1
print(os.path.abspath(path))

运行结果:

1
D:\PycharmProjects\practise_20180731\aaa\bbb\ccc\ddd.py

split(path)

split函数将path拆分成dirname和basename,返回二元元组

1
print(os.path.split(path))

运行结果:

1
('aaa/bbb/ccc', 'ddd.py')

dirname(path)

dirname函数返回path的目录名。实际上是通过将path参数传递个 split()函数得到的返回值的第一个元素.

1
print(os.path.dirname(path))

运行结果:

1
aaa/bbb/ccc

basename(path)

返回路径名path的最后一级的名称。它为将path参数传递给split()函数返回的元组对的第二个元素。请注意,这个函数的结果不同于Unix的basename程序;对于’/foo/bar/’,Unix的basename返回’bar’,而basename()函数返回空字符串(’‘)。

1
print(os.path.basename(path))

运行结果:

1
ddd.py

getsize(path)

返回path的大小,以字节为单位。如果文件不存在或无法访问,则引发OSError。

1
print(os.path.getsize(path))

运行结果:

1
50

getatime(path),getctime(path),getmtime(path)

getatime, getctime, getmtime三个函数分别返回文件的最后访问、创建、修改时间,path无效则抛出OSError 可以使用time.gmtime()来以struct_time形式输出最近修改时间(不过要额外导入time模块import time

1
2
3
4
print(os.path.getatime(path))
print(time.gmtime(os.path.getatime(path)))
print(time.gmtime(os.path.getctime(path)))
print(time.gmtime(os.path.getmtime(path)))

运行结果:

1
2
3
4
1533089540.9916
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=1, tm_hour=2, tm_min=12, tm_sec=20, tm_wday=2, tm_yday=213, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=1, tm_hour=2, tm_min=11, tm_sec=51, tm_wday=2, tm_yday=213, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=1, tm_hour=2, tm_min=12, tm_sec=20, tm_wday=2, tm_yday=213, tm_isdst=0)

isabs,isfile,isdir,islink,ismount

isabs,isfile,isdir,islink,ismount函数分别判断path是否为绝对路径,常规文件,文件夹,链接,挂载点

1
2
3
4
5
print(os.path.isabs(path))
print(os.path.isfile(path))
print(os.path.isdir(path))
print(os.path.islink(path))
print(os.path.ismount(path))

运行结果:

1
2
3
4
5
False
True
False
False
False

commonpath(paths)、commonprefix(list)

commonpath返回paths参数序列中,所有路径序列中共有的最长的路径.如果 paths 即包含绝对路径又包含相对路径,或者 paths 为空将抛出ValueError.不同于 commonprefix()函数, commonpath()返回一个有效的路径.

commonprefix返回列表中所有路径的前缀的最长路径前缀(逐个字符)。如果列表为空,则返回空字符串(’‘)。此函数可能返回无效路径,因为它一次处理一个字符。要获取有效路径,请参阅commonpath()。

1
2
3
4
5
print(os.path.commonpath(["/aaa/bbb", "/aaa/bbb/ccc"]))

print(os.path.commonprefix(["/aaa/bbb", "/aaa/bbb/ccc"]))
print(os.path.commonprefix([""]))
print(os.path.commonprefix(["/aaa/bbc", "/aaa/bbb/ccc"]))

运行结果:

1
2
3
4
\aaa\bbb
/aaa/bbb

/aaa/bb

2 其他

下一篇文章将会介绍os模块的其他功能,比如:新建、删除、重命名、查询文件或文件夹 还有调用系统命令等