一、前言

本小节梳理了os常用的一些方法,并介绍一个小案例。

环境说明:Python 3.6、windows11 64位

二、os常用方法

注意:使用方法前需要先调用os库,即import os

os.getcwd()      # 获取当前目录
os.chdir(path)   # 将path设置为当前工作目录,相当于终端的切换路径
os.listdir(path) # path是一个目录,返回目录下的所有文件和文件夹,可以采用相对路径,如path='.'
os.mkdir(path)   # 创建一个名为 path 的目录
os.rmdir(path)   # 删除目录path。如果目录不存在或不为空,则会分别抛出 FileNotFoundError 或 OSError 异常。要删除整个目录树,可以使用 shutil.rmtree()
os.remove(path)  # 删除文件path,如果path是目录,则会引发 IsADirectoryError。
os.rename(old,new) # 重命名文件或目录,新的名字存在会报错
os.replace(old,new)# 重命名文件或目录,如果new是非空目录,将抛出 OSError 异常。如果new已存在且为文件,则进行静默替换
os.stat(path)    # 获取文件或文件描述符的状态
os.walk(top)     # 生成目录树中的文件名,方式是按上->下或下->上顺序浏览目录树。对于以 top 为根的目录树中的每个目录(包括 top 本身),它都会生成一个三个元素的元组:(dirpath, dirnames, filenames)。
os.environ       # 获取系统环境变量

os.path.abspath(path) # 返回path规范化的绝对路径
os.path.basename(path)# 返回path的文件名。
os.path.dirname(path) # 返回文件/目录的目录
os.path.exists(path)  # 判断文件/目录是否存在,存在返回 True。
os.path.getatime(path)# 获取文件/目录的最后访问时间。
os.path.getmtime(path)# 获取文件/目录的最后修改时间。
os.path.getsize(path) # 获取文件/目录的大小,以字节为单位。
os.path.isabs(path)   # 判断文件/目录是不是绝对路径,是则返回True
os.path.isfile(path)  # 判断path是不是文件,是则返回True。
os.path.isdir(path)   # 判断path是不是现有的目录,是则返回True。
os.path.join(path,*paths) # 拼接多个路径,依次拼接
os.path.split(path)   # 将路径 path 拆分为一对,即 (head, tail),其中,tail 是路径的最后一部分,可以是文件或目录,而 head 里是除最后部分外的所有内容。tail 部分不会包含斜杠,head 末尾的斜杠会被去掉,除非它是盘符。
os.path.splitext(path)# 将路径拆分为文件拓展名和剩下的部分,扩展名最多只包含一个句点。

2.1 拆分和拼接路径

拆分路径,将最后一部分拆分出来,可以是带后缀的文件名或者目录。

# 关于os.path.split()的测试
>>> os.path.split('D:\test1\\test2\\testfile.txt')
('D:\test1\\test2', 'testfile.txt')
>>> os.path.split('D:\test1\\test2\\')
('D:\test1\\test2', '')
>>> os.path.split('D:\test1\\test2')
('D:\test1', 'test2')
>>> os.path.split('D:\test1')
('D:', '\test1')

拼接路径,将一个或多个路径拼接在一起,一般是一个目录+一个文件的拼接。

# 关于os.path.join()的测试
>>> os.path.join('D:\\test1','test2\\test3','testfile.txt') 
'D:\\test1\\test2\\test3\\testfile.txt'
>>> os.path.join('D:\\test1','test2\\test3\\','testfile.txt')   # test2\\test3\\末尾可不加\\
'D:\\test1\\test2\\test3\\testfile.txt'
>>> os.path.join('D:\\test1','\\test2\\test3','testfile.txt')   # \\test2\\test3开头加\\拼接到上一个参数的根目录
'D:\\test2\\test3\\testfile.txt'
>>> os.path.join('D:\\test1','\\test2\\test3','\\testfile.txt') # 前面两个拼接完,拼上第3个和拼第2个时同理,拼接到上一个参数的根目录
'D:\\testfile.txt'
>>> os.path.join('D:','test2\\test3','testfile.txt') 
'D:test2\\test3\\testfile.txt'
>>> os.path.join('D:\\','test2\\test3\\','testfile.txt')        # 第1个参数是盘符需要加\\
'D:\\test2\\test3\\testfile.txt'

2.2 判断文件后缀

# 匹配文件后缀
file_name = 'W020220823719312969888.jpg'
if 'jpg' in file_name:
    print('ok')
if file_name.endswith('.jpg'):
    print('ok')
if os.path.splitext(file_name)[1] == '.jpg':
    print('ok')

如果要当前目录下某一类文件,也可以通过glob.glob()方法实现。如获取当前目录下的.jpg文件:

import glob
print(glob.glob('*.jpg'))

如果要获取的目录不是当前目录下的呢?那就使用os.chdir(path)将目标目录设置为当前目录。

import os,glob
path = '目标目录'
os.chdir(path)
print(glob.glob('*.jpg'))

如果想获取完指定目录下的文件名后再返回一开始的工作目录,则可以使用os.getcwd()先暂存当前工作目录,等获取完再切回来,参考代码如下:

import os,glob
old_path = os.getcwd()
new_path = '目标目录'
os.chdir(new_path)
print(glob.glob('*.jpg'))
os.chdir(old_path)

三、小案例

可参考之前写过的一篇文章《Python 利用os模块批量修改文件名 并打包成可执行程序》。
通过os模块批量修改文件名,如果是本地有Python环境则可不必打包成可执行程序,直接运行代码即可。如果是给没有Python环境的伙伴则可以考虑打包起来。


更多方法可参考官方文档:
osos.path


<下节预告:debug>


- End -