Python os 模块

Python os 模块的常用功能:目录操作、路径处理、文件信息获取、环境变量及系统命令等

OS 模块

os 模块是一个功能强大的模块,主要提供操作系统相关功能接口,例如:文件目录操作、进程相关操作、执行系统命令、解析环境变量等。

使用 os 模块,我们首先要导入:

1
import os

下面我们对这些功能逐一介绍。

1. 目录相关操作

目录相关常用操作如下表:

方法说明
os.getcwd()获取当前脚本工作的目录路径
os.getcwdb()同上,返回 byte 对象
os.chdir(path)修改当前目录为 path
os.mkdir(path, mode=0o777, *, dir_fd=None)创建目录
os.makedirs(name, mode=0o777, exist_ok=False)创建多层目录
os.rmdir(path, *, dir_fd=None)删除目录
os.removedirs(name)删除多级目录
os.listdir(path='.')返回指定目录下所有文件
scandir(path='.')返回迭代器,内容为指定目录下所有文件目录
os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)修改路径权限
os.rename(src, dst, ...)修改文件名

相关操作示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 开发环境 Ubuntu
# 获取当前目录
dirname = 'test'
pwd = os.getcwd()
print('当前工作目录:', pwd)

path = '/home/hyg/tmp'
# 获取指定文件夹下所有文件
listf = os.listdir(path)
print(f'{path} files: {listf}')

# 切换当前工作目录
os.chdir(path)
# 查看当前路径
print('切换工作目录:', os.getcwd())

# 当前目录下创建目录
os.mkdir(dirname)
# 显示当前目录下文件
print(f'{path} files: {os.listdir("./")}')

# 删除目录
os.rmdir(dirname)

# 切回当前目录
os.chdir(pwd)
# 显示当前目录
print('当前工作目录:', pwd)

输出结果

1
2
3
4
5
当前工作目录: /home/hyg/tmp
/home/hyg/tmp files: ['1.jpg', '2.jpg']
切换工作目录: /home/hyg/tmp
/home/hyg/tmp files: ['test', '1.jpg', '2.jpg']
当前工作目录: /home/hyg/tmp

2. os.path 相关方法

这些方法包括目录判断、路径获取、路径拼接、文件信息获取等。

2.1 文件判断

方法说明
os.path.isdir(s)判断是否为目录,如果是目录返回 True
os.path.isfile(s)判断是否为文件,如果是文件返回 True
os.path.exists(path)判断文件或目录是否存在,存在返回 True

2.2 文件路径获取

方法说明
os.path.dirname(path)返回目录所在路径
os.path.split(p)目录切分,返回元组 (head, tail)
os.path.basename(p)返回最后一级目录
os.path.join(a, *p)目录拼接
os.path.abspath(path)获取文件绝对路径

注意 basenamesplit 的区别,来看两个例子:

1
2
3
4
5
6
7
8
9
def func(path):
    print(f'split   :{path}, result:{os.path.split(path)}')
    print(f'basename:{path}, result:{os.path.basename(path)}')

path = '/home/linux/test/1.txt'
func(path)
path = '/home/linux/test/'
func(path)
func('1.txt')

输出结果

1
2
3
4
5
6
split   :/home/linux/test/1.txt, result:('/home/linux/test', '1.txt')
basename:/home/linux/test/1.txt, result:1.txt
split   :/home/linux/test/, result:('/home/linux/test', '')
basename:/home/linux/test/, result:
split   :1.txt, result:('', '1.txt')
basename:1.txt, result:1.txt

注意路径及输出格式。

关于目录拼接:很多代码实现如下面这种方式:

1
2
3
path = '/home/linux/test'
fpath = path + '/' + '1.txt'
print(fpath)

输出结果:

1
/home/linux/test/1.txt

这种方式存在的问题:

  1. 跨平台问题:Linux 与 Windows 下目录表达方式不一样。
  2. 路径拼接时,目录之间分隔符有严格限制,容易出错。

推荐使用 os.path.join

1
2
3
4
5
6
7
path = '/home/linux/test/'
fpath = os.path.join(path, '1.txt')
print(fpath)

path = '/home/linux/test'
fpath = os.path.join(path, '1.txt')
print(fpath)

输出结果:

1
2
/home/linux/test/1.txt
/home/linux/test/1.txt

path 最后有无反斜杠,join 都可以正确处理,但字符串拼接方式则不行。

2.3 获取文件信息

方法说明
os.stat(path, *, dir_fd=None, follow_symlinks=True)获取文件或目录信息
os.path.getatime(filename)获取文件最后访问时间
os.path.getctime(filename)获取文件最后改变时间
os.path.getmtime(filename)获取文件最后修改时间
os.path.getsize(filename)获取文件大小

getctimegetmtime 的区别
两者都是获取文件最后修改时间,但区别在于:

  • 文件内容修改:对两个方法获取的时间都有影响。
  • 文件权限、用户修改:只对 getctime 获取的时间有影响。

使用 Python 代码验证:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import os
path = '/home/linux/test/1.txt'

# 获取文件修改时间
print('ctime:', os.path.getctime(path), 'mtime:', os.path.getmtime(path))

# 修改文件权限
os.chmod(path, 0o777)

# 再次获取文件修改时间
print('ctime:', os.path.getctime(path), 'mtime:', os.path.getmtime(path))

# 获取文件大小
print(os.path.getsize(path))

输出结果

1
2
3
ctime: 1554518401.870203 mtime: 1554518401.870203
ctime: 1554518438.9467654 mtime: 1554518401.870203
5

3. 其他一些方法

方法说明
os.system(command)执行命令
os._exit(status)退出当前进程,需要添加退出状态
os.getenv(key, default=None)获取指定环境变量
os.putenv(name, value, /)设置指定环境变量
os.environ环境变量获取与设置

os._exit 可以直接让当前运行程序退出,并能够添加退出状态。

system 的使用示例:在指定目录创建文件(Linux 下创建文件的 shell 命令:touch fname

1
2
3
4
5
6
7
8
9
path = '/home/linux/test/tmp'
print(os.listdir(path))

fname = os.path.join(path, '1.txt')
print(fname)

# 创建文件
os.system('/usr/bin/touch %s' % fname)
print(os.listdir(path))

输出结果

1
2
3
[]
/home/linux/test/tmp/1.txt
['1.txt']

环境变量设置:有两种方式获取环境变量:

  1. os.getenv:根据环境变量名称直接获取,如果没有获取到则返回 None
  2. os.environ:获取系统所有环境变量,可以使用字典方式去获取和设置环境变量。

对应设置环境变量,os.putenv 对于某些平台可能不支持,可以使用 os.environ 设置。

下面我们来具体操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
print('HOME=', os.getenv('HOME'))

# 设置环境变量(部分平台可能不支持)
os.putenv('Test', 'testval')
print('Test=', os.getenv('Test'))

# 使用 environ
print('environ[HOME]=', os.environ['HOME'])

# 设置环境变量 Test(推荐)
os.environ['Test'] = 'testval'
print('Test=', os.getenv('Test'))

可以看到,在 Ubuntu 中使用 putenv 不生效,我们可以使用 os.environ 替换。

os 模块还有很多其他常用方法与属性,遇到问题可以查阅官方文档