Python遍历文件夹的两种方法比较

来源:互联网 发布:背单词的软件 编辑:程序博客网 时间:2024/05/20 23:07

模块os中的walk()函数可以遍历文件夹下所有的文件。

[python] view plain copy
  1. os.walk(top, topdown=Ture, onerror=None, followlinks=False)  

该函数可以得到一个三元tupple(dirpath, dirnames, filenames).


参数含义:

  • dirpath:string,代表目录的路径;
  • dirnames:list,包含了当前dirpath路径下所有的子目录名字(不包含目录路径);
  • filenames:list,包含了当前dirpath路径下所有的非目录子文件的名字(不包含目录路径)。

注意,dirnames和filenames均不包含路径信息,如需完整路径,可使用os.path.join(dirpath, dirnames)


下面给出代码;

[python] view plain copy
  1. # -*- coding: utf-8 -*-   
  2.   
  3. import os  
  4.   
  5. def file_name(file_dir):   
  6.     for root, dirs, files in os.walk(file_dir):  
  7.         print(root) #当前目录路径  
  8.         print(dirs) #当前路径下所有子目录  
  9.         print(files) #当前路径下所有非目录子文件  

当需要特定类型的文件时,代码如下:

[python] view plain copy
  1. # -*- coding: utf-8 -*-   
  2.   
  3. import os  
  4.   
  5. def file_name(file_dir):   
  6.     L=[]   
  7.     for root, dirs, files in os.walk(file_dir):  
  8.         for file in files:  
  9.             if os.path.splitext(file)[1] == '.jpeg':  
  10.                 L.append(os.path.join(root, file))  
  11.     return L  

os.listdir()函数得到的是仅当前路径下的文件名,不包括子目录中的文件,所有需要使用递归的方法得到全部文件名。


直接给出代码,函数将返回类型为‘.jpeg’个文件名:

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2. import os  
  3.   
  4. def listdir(path, list_name):  
  5.     for file in os.listdir(path):  
  6.         file_path = os.path.join(path, file)  
  7.         if os.path.isdir(file_path):  
  8.             listdir(file_path, list_name)  
  9.         elif os.path.splitext(file_path)[1]=='.jpeg':  
  10.             list_name.append(file_path)  


遍历文件夹是一个很常用的功能吧。这里分别用两种方法实现: 

    第一种:使用os.walk:

  1. # -*- coding: utf-8 -*- 
  2. import os 
  3. def Test1(rootDir): 
  4.     list_dirs = os.walk(rootDir) 
  5.     for root, dirs, files in list_dirs: 
  6.         for d in dirs: 
  7.             print os.path.join(root, d)      
  8.         for f in files: 
  9.             print os.path.join(root, f) 

    第二种:使用os.listdir:

  1. # -*- coding: utf-8 -*- 
  2. import os 
  3. def Test2(rootDir): 
  4.     for lists in os.listdir(rootDir): 
  5.         path = os.path.join(rootDir, lists) 
  6.         print path 
  7.         if os.path.isdir(path): 
  8.             Test2(path) 

这两种到底有什么区别呢?

这里先建立一个测试目录E:\test,目录结构如下:

  1. E:\TEST 
  2. │--A 
  3. │  │--A-A 
  4. │  │  │--A-A-A.txt 
  5. │  │--A-B.txt 
  6. │  │--A-C 
  7. │  │  │--A-B-A.txt 
  8. │  │--A-D.txt 
  9. │--B.txt 
  10. │--C 
  11. │  │--C-A.txt 
  12. │  │--C-B.txt 
  13. │--D.txt 
  14. │--E 

下面通过运行如下代码:

  1. Test1('E:\TEST'
  2. print '=======================================' 
  3. Test2('E:\TEST'

输出结果为:

  1. >>>  
  2. E:\TEST\A 
  3. E:\TEST\C 
  4. E:\TEST\E 
  5. E:\TEST\B.txt 
  6. E:\TEST\D.txt 
  7. E:\TEST\A\A-A 
  8. E:\TEST\A\A-C 
  9. E:\TEST\A\A-B.txt 
  10. E:\TEST\A\A-D.txt 
  11. E:\TEST\A\A-A\A-A-A.txt 
  12. E:\TEST\A\A-C\A-B-A.txt 
  13. E:\TEST\C\C-A.txt 
  14. E:\TEST\C\C-B.txt 
  15. ======================================= 
  16. E:\TEST\A 
  17. E:\TEST\A\A-A 
  18. E:\TEST\A\A-A\A-A-A.txt 
  19. E:\TEST\A\A-B.txt 
  20. E:\TEST\A\A-C 
  21. E:\TEST\A\A-C\A-B-A.txt 
  22. E:\TEST\A\A-D.txt 
  23. E:\TEST\B.txt 
  24. E:\TEST\C 
  25. E:\TEST\C\C-A.txt 
  26. E:\TEST\C\C-B.txt 
  27. E:\TEST\D.txt 
  28. E:\TEST\E 
  29. >>>  

可以看出,对于第一种方法,输出总是先文件夹后文件名的,对于第二种,则是按照目录树结构以及按照首字母排序进行输出的。

另外之前打印出的目录树其实就是通过对第二种方法进行稍微修改实现的,如下:

  1. def Test3(rootDir, level=1): 
  2.     if level==1print rootDir 
  3.     for lists in os.listdir(rootDir): 
  4.         path = os.path.join(rootDir, lists) 
  5.         print '│  '*(level-1)+'│--'+lists 
  6.         if os.path.isdir(path): 
  7.             Test3(path, level+1
原创粉丝点击