os模块os模块负责程序与操作系统的交互,提供了拜访操作系统底层的接口;即os模块提供了十分丰盛的办法用来解决文件和目录。
应用的时候须要导入该模块:import os
罕用办法如下:办法名作用
遍历所有文件及文件夹
取得以后python程序运行门路
import osprint(os.getcwd()) # 输入以后代码所在模块的门路# /Users/running/PycharmProjects/chapter04/novel
切换目录到chapter03我的项目下:
os.chdir('/Users/running/PycharmProjects/chapter03')
查看当前目录下的所有文件和文件夹,并判断是否是文件和文件夹
import osfiles = os.listdir()for file in files: print(file, os.path.isdir(file), os.path.isfile(file))
输入后果:
或者应用:
forfileinos.scandir(): print(file.name, file.path, file.is_dir())
能够调用file.stat()获取更加具体的文件信息。如:
其中:st_size:文件的体积大小(单位:bytes),除以1024就是KBst_atime:文件的最近拜访工夫st_mtime:文件的最近批改工夫st_ctime:Windows下示意创立工夫
案例1:
1.键盘输入一个门路
2.统计该门路下的文件和文件夹,以及别离的数量
3.统计以后门路下蕴含文件名称中蕴含demo的文件数量,留神不辨别大小写
import ospath = input('输出要查问的门路:')os.chdir(path) file_list = []dir_list = []for file inos.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 sysfrom stat import *defwalktree(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: continueif S_ISDIR(mode): # directory, recurse into it walktree(pathname, callback) else: # file, whatever type, make the call back function callback(pathname) returndefprintfile(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)
fordirpath, dirnames, filesinos.walk('./'): print(dirpath,dirnames,files)
当然也能够应用glob模块疾速实现,假如要获取主目录中所有的mp4文件:
此时应用glob更加不便
import globt_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 datetimepath = input('输出要查问的门路:')os.chdir(path)paths = glob.glob('**/*.zip',recursive = True)forpathin 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))
批量操作文件及文件夹
创立文件夹和多层文件夹
import osifnotos.path.exists('新文件夹名'): os.mkdir('新文件夹名')# 创立多层文件夹os.makedirs('第一层文件夹/第二层文件夹/第三层文件夹')
复制文件或者文件夹
复制、挪动、删除文件夹须要借助另一个模块:shutil模块
# 首先导入模块import shutilimport osshutil.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 datetimeimport shutilimport globpath = input('输出要查问的门路:')os.chdir(path)ifnotos.path.exists('最新视频'): os.mkdir('最新视频')for dirpath,dirnames,files inos.walk('./'): for file inos.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!!!')