os模块

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;即os模块提供了非常丰富的方法用来处理文件和目录。

使用的时候需要导入该模块:import 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.scandir()

和listdir相近的功能,列出指定目录的文件 Python 官方推荐

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()

是否为文件

遍历所有文件及文件夹

获得当前python程序运行路径

import os print(os.getcwd()) # 输出当前代码所在模块的路径 # /Users/running/PycharmProjects/chapter04/novel

切换目录到chapter03项目下:

os.chdir('/Users/running/PycharmProjects/chapter03')

查看当前目录下的所有文件和文件夹,并判断是否是文件和文件夹

import os files = os.listdir() for file in files: print(file, os.path.isdir(file), os.path.isfile(file))

输出结果:

python开发流程管理软件(Python办公自动化之OS模块的常见用法)(1)

或者使用:

for file in os.scandir(): print(file.name, file.path, file.is_dir())

可以调用file.stat()获取更加详细的文件信息。如:

python开发流程管理软件(Python办公自动化之OS模块的常见用法)(2)

其中:

st_size:文件的体积大小(单位:bytes),除以1024就是KB

st_atime:文件的最近访问时间

st_mtime:文件的最近修改时间

st_ctime:Windows下表示创建时间

案例1:

1. 键盘输入一个路径

2. 统计该路径下的文件和文件夹,以及分别的数量

3. 统计当前路径下包含文件名称中包含demo的文件数量,注意不区分大小写

import os path = input('输入要查询的路径:') os.chdir(path) file_list = [] dir_list = [] for file in os.scandir(): if file.is_dir(): dir_list.append(file.name) else: file_list.append(file.name) print("文件夹的总量是{},\n文件为别为{}".format(len(dir_list),dir_list)) print('{}'.format('-'*30)) print("文件总量是{},\n文件为别为{}".format(len(file_list),file_list)) print('{}'.format('-'*30)) python_list = [] for name in file_list: if 'demo' in name.lower(): python_list.append(name) print('含有python单词的文件数量有{}个,\n文件分别为{}'.format(len(python_list),python_list))

如果要遍历一个目录下的所有子目录,里面指定的文件,我们可以通过递归函数遍历每个目录进行查找或者使用os.walk(),递归实现代码如下:

import os import sys from stat import * def walktree(top, callback): for f in os.listdir(top): pathname = os.path.join(top, f) try: mode = os.stat(pathname, follow_symlinks=False).st_mode except: continue if S_ISDIR(mode): # directory, recurse into it walktree(pathname, callback) else: # file, whatever type, make the call back function callback(pathname) return def printfile(file): print('get to', file) if __name__ == '__main__': if (os.path.isabs(sys.argv[1]) and os.path.exists(sys.argv[1])): walktree(sys.argv[1], printfile)

Python os模块的walk()函数,顾名思义,就是用来遍历目录树的,此函数可以很方便的遍历以输入的路径为root的所有子目录和其中的文件。

walk函数是一个Python生成器(generator),调用方式是在一个for...in...循环中,walk生成器每次返回的是一个含有3个元素的tuple,分别是 (dirpath, dirnames, filenames)

for dirpath, dirnames, files in os.walk('./'): print(dirpath,dirnames,files)

当然也可以使用glob模块快速实现,假设要获取主目录中所有的mp4文件:

python开发流程管理软件(Python办公自动化之OS模块的常见用法)(3)

此时使用glob更加方便

import glob t_list = glob.glob('t*') print(t_list) # 获取当前目录下t开头的文件,但是不能获取子文件夹里面的内容

Python的glob还支持**规则(从3.5开始),当**规则与另一个参数recursive=True配合的时候,可以深入的路径的子目录当中去匹配:

glob.glob('**') # 获取当前目录的文件和文件夹 glob.glob('**/') # 获取当前目录的文件夹 # 如果**结合recursive=True使用,但是如果结合一个*则不能实现递归 glob.glob('**/',recursive=True) # 可以遍历出所有的子目录 # 若要获取子目录中的文件则需要 glob.glob('**/*.mp4',recursive=True)

案例2:

1. 键盘输入一个路径

2. 搜索该路径下文件大小超过50M的zip文件

3. 搜索该路径下最后修改日期在30天前的文件

4. 打印显示2,3的文件

import os import datetime path = input('输入要查询的路径:') os.chdir(path) paths = glob.glob('**/*.zip',recursive = True) for path in paths: file_size = os.stat(path).st_size/1024/1024 file_modify = datetime.datetime.fromtimestamp(os.stat(path).st_mtime) days = (datetime.datetime.now() - file_modify).days if (file_size > 50) and (days > 30): print('压缩包的路径名称是:{},大小为{:.2f}MB,创建文件年份为:{}'.format(path,file_size,file_build_year))

python开发流程管理软件(Python办公自动化之OS模块的常见用法)(4)

批量操作文件及文件夹

创建文件夹和多层文件夹

import os if not os.path.exists('新文件夹名'): os.mkdir('新文件夹名') # 创建多层文件夹 os.makedirs('第一层文件夹/第二层文件夹/第三层文件夹')

复制文件或者文件夹

复制、移动、删除文件夹需要借助另一个模块:shutil模块

# 首先导入模块 import shutil import os shutil.copy('文件名', '目标文件夹') # 将文件复制到指定文件夹 shutil.copy('文件名', '目标文件夹/新文件名.txt') # 复制并重命名文件 #如果复制的是文件夹 shutil.copytree('源文件夹','目标文件夹') # 如果不想复制文件而是移动文件,可以使用过move方法 使用方法类似copy,也可以移动文件夹 shutil.move('文件名', '目标文件夹/') shutil.move('源文件夹','目标文件夹/') # 文件夹后面记住最后加斜杠/ # 若要删除文件夹 shutil.rmtree('文件夹名') # 删除文件 os.remove('文件名')

案例3:

1. 键盘输入一个路径

2. 获取里面所有的mp4文件

3. 重命名mp4文件在每个文件前面添加前缀,前缀就是文件最后修改的年月日(如:2021-08-18_西游记01.mp4)

4. 新建文件夹:最新视频

5. 将重命名的视频批量移动到最新视频文件夹

import os import datetime import shutil import glob path = input('输入要查询的路径:') os.chdir(path) if not os.path.exists('最新视频'): os.mkdir('最新视频') for dirpath,dirnames,files in os.walk('./'): for file in os.scandir(dirpath): if file.name.endswith(".mp4"): tm = datetime.datetime.fromtimestamp(file.stat().st_mtime) new_file = str(tm.year) '-' str(tm.month) '-' str(tm.day) '-' file.name os.rename(dirpath '/' file.name,new_file) file_ls = glob.glob('*.mp4') for name in file_ls: shutil.move(name,'最新视频/') print('over!!!')

,