os模块os模块负责程序与操作系统的交互,提供访问操作系统底层的接口;也就是说,os模块提供了非常丰富的处理文件和目录的方法。使用的时候需要导入这个模块:importos的常用方法如下:方法名的作用是遍历所有文件和文件夹,获取当前python程序的运行路径importosprint(os.getcwd())#输出当前代码所在模块的路径#/Users/running/PycharmProjects/chapter04/novel切换目录到chapter03项目:os.chdir('/Users/running/PycharmProjects/chapter03')查看所有文件和当前目录下的文件夹,判断是否为文件和文件夹importosfiles=os.listdir()forfileinfiles:print(file,os.path.isdir(file),os.path.isfile(file))result:或者使用:forfileinos.scandir():print(file.name,file.path,file.is_dir())可以调用file.stat()获取更详细的文件信息。如:其中:st_size:文件的大小(单位:字节),除以1024就是KBst_atime:文件的最新访问时间st_mtime:文件的最新修改时间st_ctime:Windows下的创建时间案例1:1.键盘输入一个路径2.统计路径下的文件和文件夹,以及各自的数量3.统计当前路径下文件名中包含demo的文件个数,注意大小写不敏感importospath=input('输入要查询的路径:')os.chdir(path)file_list=[]dir_list=[]forfileinos.scandir():iffile.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=[]fornameinfile_list:if'demo'inname.lower():python_list.append(name)print('There是包含python单词的{}文件,\n这些文件是{}'.format(len(python_list),python_list))如果我们想遍历一个目录下的所有子目录和里面的指定文件,我们可以使用递归函数遍历每个目录进行搜索或使用os.walk()。递归实现代码如下:importosimportsysfromstatimport*defwalktree(top,callback):forfinos.listdir(top):pathname=os.path.join(top,f)try:mode=os.stat(pathname,follow_symlinks=False).st_modeexcept:continueifS_ISDIR(mode):#目录,递归到其中walktree(pathname,callback)else:#文件,无论类型,使回调函数callback(pathname)returndefprintfile(file):print('getto',file)if__name__=='__main__':if(os.path.isabs(sys.argv[1])andos.path.exists(sys.argv[1])):walktree(sys.argv[1],printfile)Pythonos模块的walk()函数,顾名思义,就是用来遍历目录树。这个函数以输入的路径为根,遍历其中的所有子目录和文件,非常方便walk函数是一个Python生成器(generator),在for...in...循环中被调用。walk生成器每次返回一个包含3个元素的元组,分别是(dirpath,dirnames,filenames)fordirpath,dirnames,filesinos.walk('./'):print(dirpath,dirnames,files)当然也可以是通过使用glob模块快速实现。假设要获取主目录下的所有mp4文件:此时使用glob更方便importglobt_list=glob.glob('t*')print(t_list)#获取当前目录下t开头的文件目录,而不是子文件夹中的内容Python的glob也支持规则(从3.5开始),当规则和其他参数recursive=True配合时,可以深入到路径的子目录进行匹配:glob.glob('**')#获取当前目录的文件和文件夹glob.glob('**/')#获取当前目录的文件夹#如果**与recursive=True结合使用,但如果与a*,无法实现递归glob.glob('**/',recursive=True)#可以遍历所有子目录#要得到glob.glob('**/*.mp4',recursive=True)子目录中的文件。情况二:1.用键盘输入路径2.在该路径下搜索文件大小超过50M的zip文件3.搜索该路径下最后修改日期为30天前的文件4.打印显示2、3文件导入osimportdatetimepath=input('请输入要查询的路径:')os.chdir(path)paths=glob.glob('**/*.zip',recursive=True)forpathinpaths:file_size=os.stat(路径).st_size/1024/1024file_modify=datetime.datetime.fromtimestamp(os.stat(path).st_mtime)days=(datetime.datetime.now()-file_modify).daysif(file_size>50)and(days>30):print('压缩包路径名为:{},大小为{:.2f}MB,文件创建年份为:{}'.format(path,file_size,file_build_year))批量操作文件和文件夹创建文件夹和多层文件夹importosifnotos.path.exists('newfoldername'):os.mkdir('newfoldername')#创建多层foldersos.makedirs('一级文件夹/二级文件夹/三级文件夹')复制文件或文件夹复制、移动、删除文件夹需要另外一个模块:shutilmodule#首先导入模块importshutilimportosshutil.copy('filename','targetfolder')#复制文件到指定文件夹shutil.copy('filename','targetfolder/newfilename.txt')#复制并重命名文件#ifcopied是一个foldershutil.copytree('sourcefolder','targetfolder')#如果不想复制文件而是移动文件,可以使用move方法。方法和复制类似,也可以移动文件夹shutil.move('文件名','目标文件夹/')shutil.move('源文件夹','目标文件夹/')#记得加斜杠文件夹后/#删除文件夹shutil.rmtree('fileFoldername')#删除文件os.remove('filename')案例三:1.用键盘输入一个路径2.获取里面所有的mp4文件3.重命名mp4文件,在每个文件前加一个前缀,前缀为文件最后修改日期(eg:2021-08-18_西游记01.mp4)4.新建文件夹:latestvideo5.批量移动重命名的视频到最新的视频文件夹importosimportdatetimeimportshutilimportglobpath=input('请输入要查询的路径:')os.chdir(path)ifnotos.path.exists('Latestvideo'):os.mkdir('Latestvideo')fordirpath,dirnames,filesinos.walk('./'):forfileinos.scandir(dirpath):如果file.name.endswith(".mp4"):tm=datetime.datetime.fromtimestamp(file.stat().st_mtime)new_file=str(tm.year)+'-'+str(tm.month)+'-'+str(tm.day)+'-'+file.nameos.rename(dirpath+'/'+file.name,new_file)file_ls=glob.glob('*.mp4')fornameinfile_ls:shutil.move(name,'最新视频/')print('over!!!')
