Python:os
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,...)) |
注意:
- 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的更多相关文章
- python:os.path
__file__ " here = os.path.abspath(os.path.dirname(__file__)) 当"print os.path.dirname(__fil ...
- Python:os.walk()和os.path.walk()用法
转于:https://www.cnblogs.com/zmlctt/p/4222621.html 博主:zmlctt 一.os.walk() 函数声明:os.walk(top,topdown=True ...
- 初识python: os 模块
偷下懒,直接看代码吧: #!/user/bin env python # author:Simple-Sir # time:2019/8/21 16:38 # os 模块 import os # os ...
- Python:os 模块常用方法简介
返回当前工作目录 os.getcwd() 返回 path 的绝对路径 os.path.abspath(path) os.path.abspath('.') 相当于 os.getcwd() 分割目录和文 ...
- python:OS模块
r"""OS routines for NT or Posix depending on what system we're on. This exports: - al ...
- Python:os模块 time模块
1.os os.popen('cmd').read() 执行某个系统命令,:输出命令结果 os.getcwd() 获取当前操作目录 os.makedirs(r"C:\a\b\c" ...
- [转] Python 模块学习:os模块
一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...
- Python文件系统功能:os模块
Python文件系统功能:os模块 1.os模块方法分类 (1)目录: chdir() 改变工作目录 chroot() 设定当前进程的根目录 listdir() 列出指定目录下的所有文件名 mkdir ...
- Python:Day18 os模块、logging模块、正则表达式
迭代器 满足迭代器协议: 1.内部有next方法 2.内部有iter()方法 os模块 import os print(os.getcwd()) #C:\Users\Lowry\PycharmProj ...
随机推荐
- jenkins pipeline设置
转:https://mp.weixin.qq.com/s/MwyBsUWUQASGMr_erGfzZA
- vs2012 error: package 'visual c++ package' failed to load
某天打开Visual Studio突然出现了"error: package 'visual c++ package' failed to load",解决方案如下: 1. 依此顺序 ...
- 带你十天轻松搞定 Go 微服务系列(八、服务监控)
序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...
- Java 锁 概念介绍
一 Java中的锁是什么? /* * 一 Java锁定义? * 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制. * 锁旨在强制 ...
- 关于基于python2.7的unity自动化测试框架GAutomator测试环境的搭建(源码网盘下载地址:https://pan.baidu.com/s/1c2TXwtU)
关于基于python 2.7的unity自动化测试框架GAutomator测试环境的搭建 百度云盘链接(思维图学习资料):https://pan.baidu.com/s/1dFWExMD 准备工作(具 ...
- markdown介绍和使用(超全建议收藏)
Markdown介绍 Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了.Markdown编辑器使用一套格式标记 ...
- Matplotlib直方图绘制技巧
情境引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函 ...
- c#代码设计:子类和父类
哭辽,事情是这样的 我想写个产品类用来放点相机参数,想类似这种的使用方式:(时间关系不改了,产品=Zoo,animals=相机) Zoo Zooxx= new Zoo (); Zoo.Animals ...
- ApacheCN Kali Linux 译文集 20211020 更新
Kali Linux 秘籍 中文版 第一章 安装和启动Kali 第二章 定制 Kali Linux 第三章 高级测试环境 第四章 信息收集 第五章 漏洞评估 第六章 漏洞利用 第七章 权限提升 第八章 ...
- 计算机网络-5-10-TCP运输连接管理
TCP的运输连接管理 TCP是面向连接的通信,运输连接是用来传送TCP报文的,TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输连接有三个阶段,即:建立连接,数据传送,连接释 ...