python遍历文件夹python遍历文件夹python遍历文件夹python遍历文件夹
  • 首页
  • 博客
  • 书签
  • 文件
  • 分析
  • 登录

python遍历文件夹

发表 admin at 2022年3月16日
类别
  • 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路径名

发表回复 取消回复

要发表评论,您必须先登录。

类别

  • Cat
  • Python
  • Django
  • Database
  • Html/CSS
  • JavaScript
  • Vue
  • RegExp
  • Maths/AI
  • PHP/Wordpress
  • Practice
  • Linux
  • Windows
  • Android
  • NAS
  • Software
  • Hardware
  • Network
  • SEO
  • English
  • Games
  • Recipes
  • General
  • Memorandum
  • Essays
  • 未分类

归档

©2015-2023 艾丽卡 Blog support@alaica.com
      ajax-loader