1、os.walk

学习自:python中os.walk的用法详解 - 马里亚纳仰望星空 - 博客园

说明

遍历某个文件夹下的所有文件(包括子文件夹中)

用法

os.walk( top , topdown=True , onerror=None , followlinks=False)

参数

参数 说明
top 遍历目录的URL
topdown

True:优先遍历top目录

False:优先遍历top的子目录

onerror 一个callable对象,当walk异常时会调用
followlinks True:遍历目录下的快捷方式实际指向的目录

返回值

返回对象为一个三元组(root,dirs,files):

root:当前正在遍历的这个文件夹本身的URL

dirs:一个List,内容是该文件夹中所有目录(不包括子目录)

file:一个List,内容是该文件夹中的所有文件(不包含子目录中的文件)

如果topdown为True,walk会遍历top文件夹,与top文件夹中每一个子目录。

具体用法

原理:深度优先遍历

如果文件为如下结构

a   ->   b     ->  1.txt , 2.txt
c -> 3.txt
d -> 空
4.txt
5.txt
for root,dirs,files in os.walk('a'):
#第一次运行,当前目录为a
root == 'a'
dirs == [ 'b' , 'c' , 'd' ]
files == [ '4.txt' , '5.txt' ]
…… #接着遍历dirs中的每一个目录
#先是b
b : root == 'a\\b'
dirs == []
files == [ '1.txt' , '2.txt' ]
#dirs为空,返回(此处可以看出是深度优先遍历) #c
c : root == 'a\\c'
dirs == []
files == [ '3.txt' ] #如果想要获得文件的全路径,只需要
for f in files :
path = os.path.join( root , f ) #d
d : root = 'a\\d'
dirs == []
files == []
#遍历完毕,退出循环

例1:批量处理一个文件夹中的所有文件

Q1:保持目录a的目录结构,在b中创建对应的文件夹,并把a中所有的文件加上后缀_bak

A:

import os 

Root = 'a'
Dest = 'b' for root,dirs,files in os.walk(Root):
new_root = root.replace(Root , Dest , 1)
if not os.path.exists(new_root):
os.mkdir(new_root) for d in dirs :
d=os.path.join(new_root , d)
if not os.path.exists(d):
os.mkdir(d) for f in files :
#把文件名分解为 文件名.扩展名
# 这里可以添加一个filter , 过滤掉不想复制的文件类型,或者文件名
( shotname , extension ) = os.path.splitext(f)
#原文件的路径
old_path= os.path.join(root , f)
new_name = shotname+'_bak'+extension
#新文件的路径
new_path=os.path.join(new_root , new_name)
with open(new_path,'wb') as f:
f.write( open(old_path , 'rb').read() )

上文解释说明:

1、

for root,dirs,files in os.walk(Root):  ①
new_root = root.replace(Root , Dest , 1) ②
if not os.path.exists(new_root): ③
os.mkdir(new_root)

①:遍历访问Root目录下的文件、目录

②:把路径Root中的a替换为b,替换次数为一次,得到新路径new_root

③:如果new_root路径不存在,那就生成该路径代表的目录

2、

    for d in dirs : ①
d=os.path.join(new_root , d)
if not os.path.exists(d):②
os.mkdir(d)

①:对Root下所有子目录,更换新路径为 new_root/d,即'b/子目录'(以前是a/子目录)

②:如果该新路径代表的目录不存在,就用os.mkdir(d)生成

3、

for f in files :
#把文件名分解为 文件名.扩展名 ***
# 这里可以添加一个filter , 过滤掉不想复制的文件类型,或者文件名
( shotname , extension ) = os.path.splitext(f) ①
#原文件的路径
old_path= os.path.join(root , f) ②
new_name = shotname+'_bak'+extension ③
#新文件的路径
new_path=os.path.join(new_root , new_name) ④
with open(new_path,'wb') as f: ⑤
f.write( open(old_path , 'rb').read() )

对该目录下的所有文件

①:分解为文件名+后缀名的形式( shotname , extension )

②:root+filename得到老文件的路径

③:字符串拼接“+”的方式得到新文件名

(filename , extension) = os.path.splitext( f )

new_name = filename + '_bak' + extension

这种写法值得借鉴

④:新路径与新文件名用join连接得到新路径下的文件名

⑤:文件复制,方法:将老文件中的内容以读取的方式打开读出,再写入新文件中

with open(new_path , 'wb') as f :
f.write( open(old_path,'rb').read() )

补充:***处的过滤方式为,字符串的筛选方式

例2:循环访问并处理某个文件夹中的所有文件

#假设该文件夹为的绝对路径为D://Python

rootdir='D://Python'
for root, dirs, files in os.walk(rootdir):#遍历整个文件夹
for file in files:
filedir = os.path.join(root,file) #得到文件的绝对路径 也可以用 root + '\\' +file
func(filedir) #用func函数处理每个文件

2、os.path

参考文档:Python os.path() 模块 | 菜鸟教程

该模块主要用于获取文件的属性

方法

说明

os.path.abspath(path) 返回绝对路径
os.path.basename(path) 返回文件名
os.path.commonprefix(list) 返回list中,所有path共有的最长路径
os.path.dirname(path) 返回相对路径(从程序所在目录开始)
os.path.exists(path) 如果路径(相对/绝对)path存在,返回True;path不存在,返回False
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.join(path1,path2,...) 将路径合并,格式为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.split(path) 将路径分割为dirname和basename,返回一个元组(路径,文件名)
os.path.splitext(path) 将路径分割为文件名和扩展名的元组(文件名, 扩展名(如.txt,.py,...))

注意:

  1. os.path.join()连接时,第二个路径不能以\开头,否则会导致前一个路径被截断到第一个\处

3、其他os方法

方法 说明
os.access(path , mode) 检查文件权限模式
os.chdir(path) 改变当前工作目录
os.fchdir(fd) 通过文件描述符fd改变当前工作目录
os.chflags(path , flags) 设置路径的标记为数字标记
os.chmod(path , mode) 更改权限
os.fchmod(fd , mode) 改变一个文件的访问权限,该文件由fd指定,参数mode是Unix下的文件访问权限
os.chown(path,uid,gid) 更改文件所有者,uid为用户id,gid为用户组id
os.fchown(fd, uid ,gid) 修改文件描述符fd指定的文件的所有者
os.close(fd) 关闭文件描述符fd
os.closerange(fd_low , fd_high) 关闭所有文件描述符,从fd_low(包含)到fd_high(不包含)。错误会忽略
os.dup(fd) 复制文件描述符fd
os.dup2(fd , fd2) 将一个文件描述符fd复制到另一个fd2
os.ftruncate(fd,length) 裁剪fd指定的文件,length不能超过文件大小
os.getcwd() 返回当前工作目录的字符串
os.listdir(path) 返回path指定的文件夹包含的文件或文件夹名字的List
os.mkdir(path[,mode]) 以数字mode的mode创建一个名为path的文件夹,默认的mode是0777(八进制)
os.remove(path) 删除路径为path的文件。如果是文件夹,将抛出OSError。删除文件夹用os.removedirs
os.removedirs(path) 删除目录和目录下的所有文件
os.rename(src , dst) 重命名文件或目录,原名src修改为新名dst
os.renames(old , new) 递归地对目录进行更名,也可以对文件进行更名

3.1、listdir:列出某个路径下的所有文件和文件夹

os.listdir(os.getcwd())

Python:os的更多相关文章

  1. python:os.path

    __file__ " here = os.path.abspath(os.path.dirname(__file__)) 当"print os.path.dirname(__fil ...

  2. Python:os.walk()和os.path.walk()用法

    转于:https://www.cnblogs.com/zmlctt/p/4222621.html 博主:zmlctt 一.os.walk() 函数声明:os.walk(top,topdown=True ...

  3. 初识python: os 模块

    偷下懒,直接看代码吧: #!/user/bin env python # author:Simple-Sir # time:2019/8/21 16:38 # os 模块 import os # os ...

  4. Python:os 模块常用方法简介

    返回当前工作目录 os.getcwd() 返回 path 的绝对路径 os.path.abspath(path) os.path.abspath('.') 相当于 os.getcwd() 分割目录和文 ...

  5. python:OS模块

    r"""OS routines for NT or Posix depending on what system we're on. This exports: - al ...

  6. Python:os模块 time模块

    1.os os.popen('cmd').read() 执行某个系统命令,:输出命令结果 os.getcwd()  获取当前操作目录 os.makedirs(r"C:\a\b\c" ...

  7. [转] Python 模块学习:os模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  8. Python文件系统功能:os模块

    Python文件系统功能:os模块 1.os模块方法分类 (1)目录: chdir() 改变工作目录 chroot() 设定当前进程的根目录 listdir() 列出指定目录下的所有文件名 mkdir ...

  9. Python:Day18 os模块、logging模块、正则表达式

    迭代器 满足迭代器协议: 1.内部有next方法 2.内部有iter()方法 os模块 import os print(os.getcwd()) #C:\Users\Lowry\PycharmProj ...

随机推荐

  1. jenkins pipeline设置

    转:https://mp.weixin.qq.com/s/MwyBsUWUQASGMr_erGfzZA

  2. vs2012 error: package 'visual c++ package' failed to load

    某天打开Visual Studio突然出现了"error: package 'visual c++ package' failed to load",解决方案如下: 1. 依此顺序 ...

  3. 带你十天轻松搞定 Go 微服务系列(八、服务监控)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  4. Java 锁 概念介绍

    一   Java中的锁是什么? /* * 一 Java锁定义? * 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制. * 锁旨在强制 ...

  5. 关于基于python2.7的unity自动化测试框架GAutomator测试环境的搭建(源码网盘下载地址:https://pan.baidu.com/s/1c2TXwtU)

    关于基于python 2.7的unity自动化测试框架GAutomator测试环境的搭建 百度云盘链接(思维图学习资料):https://pan.baidu.com/s/1dFWExMD 准备工作(具 ...

  6. markdown介绍和使用(超全建议收藏)

    Markdown介绍 Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了.Markdown编辑器使用一套格式标记 ...

  7. Matplotlib直方图绘制技巧

    情境引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函 ...

  8. c#代码设计:子类和父类

    哭辽,事情是这样的 我想写个产品类用来放点相机参数,想类似这种的使用方式:(时间关系不改了,产品=Zoo,animals=相机) Zoo Zooxx= new Zoo (); Zoo.Animals ...

  9. ApacheCN Kali Linux 译文集 20211020 更新

    Kali Linux 秘籍 中文版 第一章 安装和启动Kali 第二章 定制 Kali Linux 第三章 高级测试环境 第四章 信息收集 第五章 漏洞评估 第六章 漏洞利用 第七章 权限提升 第八章 ...

  10. 计算机网络-5-10-TCP运输连接管理

    TCP的运输连接管理 TCP是面向连接的通信,运输连接是用来传送TCP报文的,TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输连接有三个阶段,即:建立连接,数据传送,连接释 ...