os.walk
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。简单来说,就是挨个遍历指定路径下的目录(文件夹)和文件。用于通过在目录树中游走输出在目录中的目录名,文件名在Unix,Windows中有效。
要使用os.walk,首先要载入该函数,可以使用以下两种方法
- import os
- from os import walk
语法
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
参数
- top: 是你所要遍历的目录的地址
- topdown: 可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
- onerror: 可选, 需要一个 callable 对象,当 walk 需要异常时,会调用。
- followlinks: 可选, 如果为 True,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)。
返回值
os.walk 的返回值是一个生成器(generator),也就是说我们需要遍历它,来获得所有的内容。每次遍历的对象都是返回的是一个三元组(root,dirs,files)
- root 所指的是当前正在遍历的这个文件夹的本身的地址
- dirs 是一个list,内容是该文件夹中所有的目录的名字(不包括子目录)
- files 同样是list,内容是该文件夹中所有的文件(不包括子目录)如果topdown 参数为真,walk 会遍历top文件夹,与top文件夹中每一个子目录。
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
for root, dirs, files in os.walk(".", topdown=False):print(dirs)print(files)# 第二次,第三次循环的是当前目录下的dirs1,dirs2文件夹,执行以上程序输出结果为:
['dirs1', 'dirs2']
['f1', 'f2', 'f3']
[]
['dirs1_f1',dirs1_2]
[]
['dirs2_f1',dirs2_2]
os.path
官方文档:http://docs.python.org/library/os.path.html
下列所列文件路径为’/home/flp/abc.txt’
os.path.abspath(path) | 返回绝对路径(‘/home/flp/abc.txt’) |
os.path.basename(path) | 返回文件名(‘abc.txt’) |
os.path.commonprefix(list) | 返回list(多个路径)中,所有path共有的最长的路径 |
os.path.dirname(path) | 返回文件路径(‘/home/flp’) |
os.path.exists(path) | 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。 |
os.path.lexists | 路径存在则返回True,路径损坏也返回True |
os.path.expanduser(path) | 把path中包含的”~”和”~user”转换成用户目录 |
os.path.expandvars(path) | 根据环境变量的值替换path中包含的”$name”和”${name}” |
os.path.getatime(path) | 返回最近访问时间(浮点型秒数) |
os.path.getmtime(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.join(‘/home/flp’,’abc.txt’) |
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,返回一个元组,如(‘/home/flp’,’abc.txt’) |
os.path.splitdrive(path) | 一般用在 windows 下,返回驱动器名和路径组成的元组 |
os.path.splitext(path) | 分割路径,返回路径名和文件扩展名的元组(‘/home/flp/abc’,’txt’) |
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路径名 |
os.stat
os.stat(‘path/filename’)
获取文件/目录信息 的结构说明
print(os.stat(c:abc)) # os.stat_result(st_mode=16895, st_ino=11821949022186825, st_dev=3303659261, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1547435238, st_mtime=1547435238, st_ctime=1543997539)stat 结构:st_mode: inode 保护模式st_ino: inode 节点号。st_dev: inode 驻留的设备。st_nlink: inode 的链接数。st_uid: 所有者的用户ID。st_gid: 所有者的组ID。st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。st_atime: 上次访问的时间。st_mtime: 最后一次修改的时间。st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
os属性
os.sep # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep # 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os其他
os.makedirs('dirname1/dirname2') # 可生成多层递归目录
os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') # 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() # 删除一个文件
os.rename("oldname","newname") # 重命名文件/目录
os.stat('path/filename') # 获取文件/目录信息os.system("bash command") # 运行shell命令,直接显示,或运行cmd命令,无返回值
os.popen("bash command).read() # 运行shell命令,返回执行结果
os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd