python遍历文件夹
介绍
遍历文件夹所需os模块的几个函数
1.os.path.exists() 和 os.listdir() 首先我们要判断该路径是不是存在,如果存在再列出该路径下的所有文件 import os path=r'D:\学习资料\kira' if os.path.exists(path): files=os.listdir(path) print(files) else: print('this path not exist') 结果: ['1', '2.txt', '3.py'] 上面结果只是列出了一级目录下的所有文件,可能会遇到文件夹套文件夹再套文件夹的情况,所以我们这边需要写一个方法,遍历该目录下的所有文件夹.直到把所有文件都找出来.这边需要用到os.path.isfile()或者os.path.isdir(),如果判断出来是文件夹,我们还需要用到os.path.join(),继续深入处理 #coding=utf-8 import os def list_allfile(path,all_files=[]): if os.path.exists(path): files=os.listdir(path) else: print('this path not exist') for file in files: if os.path.isdir(os.path.join(path,file)): list_allfile(os.path.join(path,file),all_files) else: all_files.append(os.path.join(path,file)) return all_files if __name__ == "__main__": print(list_allfile(r'D:\学习资料\kira')) 结果: ['D:\\学习资料\\kira\\1\\4.txt', 'D:\\学习资料\\kira\\2.txt', 'D:\\学习资料\\kira\\3.py'] 2.os模块的主要几个常用函数 os.path.join() #coding=utf-8 import os path=r'D:\学习资料\python' path_new=os.path.join(path,'Python编程:从入门到实践.pdf') print(path_new) 结果: D:\学习资料\python\Python编程:从入门到实践.pdf os.getcwd() #coding=utf-8 import os path_now=os.getcwd() print(path_now) 结果: C:\Users\kirazheng>py -3 C:\Users\kirazheng\Desktop\test2.py C:\Users\kirazheng 应该是当前执行的目录 os.chdir() #coding=utf-8 import os os.chdir(r'D:\学习资料\python') path_after=os.getcwd() print(path_after) 结果: C:\Users\kirazheng>py -3 C:\Users\kirazheng\Desktop\test2.py D:\学习资料\python 切换后的目录 os.makedirs() try: os.makedirs(r'D:\学习资料\python\kira') except FileExistsError: print('have this dir') 结果: 新建文件夹,中间的文件夹没有的话,也建,try except 以后介绍 os.path.abspath() #coding=utf-8 import os path_abs=os.path.abspath(r'.') print(path_abs) 结果: C:\Users\kirazheng>py -3 C:\Users\kirazheng\Desktop\test2.py C:\Users\kirazheng 相对路径变绝对路径 os.path.isabs() print(os.path.isabs(r'.')) print(os.path.isabs(r'D:\学习资料')) 结果: False True 判断是否是绝对路径 os.path.relpath() print(os.path.relpath(r'D:\学习资料', r'D:\学习资料\python\kira')) print(os.path.relpath(r'D:\学习资料\python\kira', r'D:\学习资料')) 结果: ..\.. python\kira 后面路径是start path,感觉就是看后面路径怎么到前面路径的 os.path.dirname() && os.path.basename() &&os.path.split() #coding=utf-8 import os path_new='D:\学习资料\python\Python编程:从入门到实践.pdf' print(os.path.dirname(path_new)) print(os.path.basename(path_new)) print(os.path.split(path_new)) 结果: D:\学习资料\python Python编程:从入门到实践.pdf ('D:\\学习资料\\python', 'Python编程:从入门到实践.pdf') os.listdir() #coding=utf-8 import os print(os.listdir(r'D:\学习资料\kira')) 结果: ['1', '2.txt', '3.py'] 列出该目录下的所有文件 os.path.exists() &&os.path.isfile() &&os.path.isdir() #coding=utf-8 import os print(os.path.exists(r'D:\学习资料\kira')) print(os.path.isfile(r'D:\学习资料\python')) print(os.path.isdir(r'D:\学习资料\python')) 结果: True False True 很明显字面意思,路径存不存在,是不是文件,是不是文件夹
分别用两种方法实现遍历文件夹
第一种:使用os.walk: # -*- coding: utf-8 -*- import os def Test1(rootDir): list_dirs = os.walk(rootDir) for root, dirs, files in list_dirs: for d in dirs: print os.path.join(root, d) for f in files: print os.path.join(root, f) 第二种:使用os.listdir: # -*- coding: utf-8 -*- import os def Test2(rootDir): for lists in os.listdir(rootDir): path = os.path.join(rootDir, lists) print path if os.path.isdir(path): Test2(path) 这两种到底有什么区别呢? 这里先建立一个测试目录E:\test,目录结构如下: E:\TEST │--A │ │--A-A │ │ │--A-A-A.txt │ │--A-B.txt │ │--A-C │ │ │--A-B-A.txt │ │--A-D.txt │--B.txt │--C │ │--C-A.txt │ │--C-B.txt │--D.txt │--E 下面通过运行如下代码: Test1('E:\TEST') print '=======================================' Test2('E:\TEST') 输出结果为: >>> E:\TEST\A E:\TEST\C E:\TEST\E E:\TEST\B.txt E:\TEST\D.txt E:\TEST\A\A-A E:\TEST\A\A-C E:\TEST\A\A-B.txt E:\TEST\A\A-D.txt E:\TEST\A\A-A\A-A-A.txt E:\TEST\A\A-C\A-B-A.txt E:\TEST\C\C-A.txt E:\TEST\C\C-B.txt ======================================= E:\TEST\A E:\TEST\A\A-A E:\TEST\A\A-A\A-A-A.txt E:\TEST\A\A-B.txt E:\TEST\A\A-C E:\TEST\A\A-C\A-B-A.txt E:\TEST\A\A-D.txt E:\TEST\B.txt E:\TEST\C E:\TEST\C\C-A.txt E:\TEST\C\C-B.txt E:\TEST\D.txt E:\TEST\E >>> 可以看出,对于第一种方法,输出总是先文件夹后文件名的,对于第二种,则是按照目录树结构以及按照首字母排序进行输出的。 另外之前打印出的目录树其实就是通过对第二种方法进行稍微修改实现的,如下: def Test3(rootDir, level=1): if level==1: print rootDir for lists in os.listdir(rootDir): path = os.path.join(rootDir, lists) print '│ '*(level-1)+'│--'+lists if os.path.isdir(path): Test3(path, level+1)
python的os.path包含了很多文件、文件夹操作的方法。下面列出:
os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回多个路径中,所有path共有的最长的路径。 os.path.dirname(path) #返回文件路径 os.path.exists(path) #路径存在则返回True,路径损坏返回False os.path.lexists #路径存在则返回True,路径损坏也返回True os.path.expanduser(path) #把path中包含的"~"和"~user"转换成用户目录 os.path.expandvars(path) #根据环境变量的值替换path中包含的”$name”和”${name}” os.path.getatime(path) #返回最后一次进入此path的时间。 os.path.getmtime(path) #返回在此path下最后一次修改的时间。 os.path.getctime(path) #返回path的大小 os.path.getsize(path) #返回文件大小,如果文件不存在就返回错误 os.path.isabs(path) #判断是否为绝对路径 os.path.isfile(path) #判断路径是否为文件 os.path.isdir(path) #判断路径是否为目录 os.path.islink(path) #判断路径是否为链接 os.path.ismount(path) #判断路径是否为挂载点() os.path.join(path1[, path2[, ...]]) #把目录和文件名合成一个路径 os.path.normcase(path) #转换path的大小写和斜杠 os.path.normpath(path) #规范path字符串形式 os.path.realpath(path) #返回path的真实路径 os.path.relpath(path[, start]) #从start开始计算相对路径 os.path.samefile(path1, path2) #判断目录或文件是否相同 os.path.sameopenfile(fp1, fp2) #判断fp1和fp2是否指向同一文件 os.path.samestat(stat1, stat2) #判断stat tuple stat1和stat2是否指向同一个文件 os.path.split(path) #把路径分割成dirname和basename,返回一个元组 os.path.splitdrive(path) #一般用在windows下,返回驱动器名和路径组成的元组 os.path.splitext(path) #分割路径,返回路径名和文件扩展名的元组 os.path.splitunc(path) #把路径分割为加载点与文件 os.path.walk(path, visit, arg) #遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数 os.path.supports_unicode_filenames #设置是否支持unicode路径名