1.Python文件目录操作与OS模块
咱们在理论开发中,常常须要对文件进行读取、遍历、批改等操作,通过 python 的规范内置os模块,可能以简洁高效的形式实现这些操作。常见的操作整顿如下:
- 文件夹操作:包含文件夹的创立、批改(改名/挪动),查问(查看、遍历)、删除等。
- 文件操作:包含文件的创立、批改、读取、删除等。
- 门路操作:文件夹或文件的门路操作,如绝对路径,文件名与门路宰割,扩展名宰割等
要实现文件与目录的操作,首先导入对应的os模块,代码如下:
import os
2.文件夹操作
以本地 pythontest
目录作为演示目录,此目录下以后文件如下:
<code class="shell">test │ test.txt └─test-1 test-1.txt
test
及 test-1
是文件夹,test.txt
及 test-1.txt
是文件。
(1)查问操作
在linux中咱们应用ls
/ pwd
/ cd
等实现查问与切换门路等操作,对应的python操作方法如下:
- listdir : 文件及目录列表
- getcwd :获取当前目录
- chdir :更换目录
- stat :文件及目录根本信息
- walk :递归遍历目录
>>> os.chdir("./pythontest") # 更改目录 >>> os.getcwd() # 获取当前目录 '/Users/搞代码python/pythontest' >>> os.listdir("test") # 文件及目录列表,相对路径 ['test-1', 'test.txt'] >>> os.listdir("/Users/搞代码python/test") # 文件及目录列表,绝对路径 ['test-1', 'test.txt'] >>> os.stat("test") # 获取目录信息 os.stat_result(st_mode=16877, st_ino=45805684, st_dev=16777221, st_nlink=11, st_uid=501, st_gid=20, st_size=352, st_atime=1634735551, st_mtime=1634735551, st_ctime=1634735551) >>> os.stat("test/test.txt") # 获取文件信息 os.stat_result(st_mode=33188, st_ino=45812567, st_dev=16777221, st_nlink=1, st_uid=501, st_gid=20, st_size=179311, st_atime=1634699986, st_mtime=1634699966, st_ctime=1634699984)
其中 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: 创立工夫。
日常应用中,咱们个别应用 st_size 、st_ctime 及 st_mtime 获取文件大小,创立工夫,批改工夫。另外,咱们看到输入的工夫是秒数,在这里提一下,对于日期的转换解决。
(2)遍历操作
walk 函数对目录进行递归遍历,返回 root,dirs,files,别离对应以后的遍历的目录,此目录中的子目录及文件。
data = os.walk("test") # 遍历test目录 for root,dirs,files in data: # 递归遍历及输入 print("root:%s" % root) for dir in dirs: print(os.path.join(root,dir)) for file in files: print(os.path.join(root,file))
(3)创立操作
- mkdir :新建单个目录,若目录门路中父目录不存在,则创立失败
- makedirs :新建多个目录,若目录门路中父目录不存在,则主动创立
>>> os.mkdir("new") >>> os.mkdir("new1/new1-1") # 父目录不存在,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: 零碎找不到指定的门路。: 'new1/new1-1' >>> os.makedirs("new1/new1-1") # 父目录不存在,主动创立 >>> os.listdir("new1") ['new1-1']
(4)删除操作
- rmdir :删除单个空目录,目录不为空则报错
- removedirs : 按门路删除递归多级空目录,目录不为空则报错
>>> os.rmdir("new1") # 若目录不为空,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: 目录不是空的。: 'new1' >>> os.rmdir("new1/new1-1") >>> os.removedirs("new1/new1-1") # 删除多级空目录 >>> os.listdir(".") ['new']
因为删除空目录的限度,更多的是应用 shutil
模块中的 rmtree
函数,能够删除不为空的目录及其文件。
(5)批改操作
- rename :重命名目录或文件,可批改文件或目录的门路(即挪动操作),若指标文件目录不存在,则报错。
- renames :重命名目录或文件,若指标文件目录不存在,则主动创立
>>> os.makedirs("new1/new1-1") >>> os.rename("new1/new1-1","new1/new1-2") # new1-1 new1-2 >>> os.listdir("new1") ['new1-2'] >>> os.rename("new1/new1-2","new2/new2-2") # 因为new2目录不存在,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: 零碎找不到指定的门路。: 'new1/new1-2' -> 'new2/new2-2' >>> os.renames("new1/new1-2","new2/new2-2") # renames可主动创立不存在的目录 >>> os.listdir("new2") ['new2-2']
如果指标门路文件曾经存在,那么os.rename()和os.renames()都会报错:FileExistsError,当文件已存在时,无奈创立该文件。
3.文件操作
(1)查问操作
- open/read/close :文件读取
- stat :文件信息,具体见后面文件夹中的 stat 阐明
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 关上文件 >>> str_bytes = os.read(f,100) # 读100字节 >>> str = bytes.decode(str_bytes) # 字节转字符串 >>> print(str) test write data >>> os.close(f) # 敞开文件
留神 open/read/close 须要一起操作,其中 open 操作须要指定模式,上述是以读写模式关上文件,若文件不存在则创立文件。各模式具体如下:
flags — 该参数能够是以下选项,多个应用 “|” 隔开:
- os.O_RDONLY: 以只读的形式关上
- os.O_WRONLY: 以只写的形式关上
- os.O_RDWR : 以读写的形式关上
- os.O_NONBLOCK: 关上时不阻塞
- os.O_APPEND: 以追加的形式关上
- os.O_CREAT: 创立并关上一个新文件
- os.O_TRUNC: 关上一个文件并截断它的长度为零(必须有写权限)
- os.O_EXCL: 如果指定的文件存在,返回谬误
- os.O_SHLOCK: 主动获取共享锁
- os.O_EXLOCK: 主动获取独立锁
- os.O_DIRECT: 打消或缩小缓存成果
- os.O_FSYNC : 同步写入
- os.O_NOFOLLOW: 不追踪软链接
(2)创立操作
应用open创立文件,指定模式, 若文件不存在,则创立。有点相似 linux 操作中的 touch。
>>> f = os.open("test/搞代码python.txt", os.O_RDWR|os.O_CREAT) # 若文件不存在,则创立 >>> os.close(f)
(3)批改操作
- open/write/close :写入文件内容
- rename,renames : 与后面介绍的批改名称、挪动操作统一。
>>> f = os.open("test/搞代码python.txt", os.O_RDWR|os.O_CREAT) # 关上文件 >>> os.write(f,b"搞代码python test write data") # 写入内容 15 >>> os.close(f) # 敞开文件
(4)删除
- remove :删除文件,留神不能删除目录(应用 rmdir/removedirs)
>>> os.remove("test/test-1") # 删除目录报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: 零碎找不到指定的文件。: 'test/test1' >>> os.remove("test/搞代码python.txt") # 删除文件 >>> os.listdir("test") ['test-1']
4.门路操作
在应用文件或目录过程中,常常须要对文件及目录门路进行解决,因而,os 中有一个子模块 path,专门就是解决门路操作的。次要有以下操作:
- abspath :返回绝对路径
>>> os.path.abspath("test") '/Users/搞代码python/test'
- exists :判断文件或目录是否存在
>>> os.path.exists("test") True >>> os.path.exists("test/test.txt") False >>> os.path.exists("test/test-1/test-1.txt") True
- isfile/isdir :判断是否为文件/目录
>>> os.path.isdir("test") True >>> os.path.isfile("test/test-1/test-1.txt") True
- basename/dirname:获取门路尾部和门路头部。其实就是以门路中最初一个
/
为宰割符,分为头(head) 和尾(tail)两局部,tail 是 basename 返回的内容,head 是 dirname 返回的内容。常常用于获取文件名,目录名等操作
>>> os.path.basename("test/test-1/test-1.txt") # 文件名 'test-1.txt' >>> os.path.basename("test/test-1/") # 空内容 '' >>> os.path.basename("test/test-1") # 目录名 'test-1' >>> os.path.dirname("test/test-1/test-1.txt") # 文件所在目录门路 'test/test-1' >>> os.path.dirname("test/test-1/") # 目录门路 'test/test-1' >>> os.path.dirname("test/test-1") # 父目录门路 'test'
- join :合成门路,即把两个参数应用零碎门路宰割符进行连贯,造成残缺门路。
>>> os.path.join("test","test-1") # 连贯两个目录 'test/test-1' >>> os.path.join("test/test-1","test-1.txt") # 连贯目录与文件名 'test/test-1/test-1.txt'
- split :宰割文件名和文件夹,即把 path 以最初一个斜线”/”为分隔符,切割为 head 和 tail ,以 (head, tail) 元组的模式返回。
>>> os.path.split("test/test-1") # 宰割目录 ('test', 'test-1') >>> os.path.split("test/test-1/") # 以/结尾的目录宰割 ('test/test-1', '') >>> os.path.split("test/test-1/test-1.txt") # 宰割文件 ('test/test-1', 'test-1.txt')
- splitext :宰割路径名和文件扩展名,把path 以最初一个扩展名分隔符“.”宰割,切割为 head 和 tail ,以 (head, tail) 元组的局势返回。留神与 split 的区别是分隔符的不同。
>>> os.path.splitext("test/test-1") ('test/test-1', '') >>> os.path.splitext("test/test-1/") ('test/test-1/', '') >>> os.path.splitext("test/test-1/test-1.txt") # 辨别文件名及扩展名 ('test/test-1/test-1', '.txt') >>> os.path.splitext("test/test-1/test-1.txt.mp4") # 以最初的"."为宰割点 ('test/test-1/test-1.txt', '.mp4')
5.典型利用
(1)批量批改文件名
def batch_rename(dir_path): itemlist = os.listdir(dir_path) # 获取目录文件列表 for item in itemlist: # 连接成残缺门路 item_path = os.path.join(dir_path, item) print(item_path) # 批改文件名 if os.path.isfile(item_path): splitext = os.path.splitext(item_path) os.rename(item_path, splitext[0] + "-搞代码python" + splitext[1])
(2)遍历目录及子目录下所有指定扩展名的文件
def walk_ext_file(dir_path, ext_list): # @dir_path参数:遍历的目录 # @ext_list参数:拓展名列表,例['.mp4', '.mkv', '.flv'] # 遍历 for root, dirs, files in os.walk(dir_path): # 获取文件名称及门路 for file in files: file_path = os.path.join(root, file) file_item = os.path.splitext(file_path) # 输入指定扩展名的文件门路 if file_item[1] in ext_list: print(file_path)
(3)按批改工夫排序指定目录下的文件
def sort_file_accord_to_time(dir_path): # 排序前 itemlist = os.listdir(dir_path) print(itemlist) # 正向排序 itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename))) print(itemlist) # 反向排序 itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)), reverse=True) print(itemlist) # 获取最新批改的文件 print(itemlist[0])
6.视频教程
请点击到B站查看【双语字幕】版本
https://www.bilibili.com/vide…
材料与代码下载
本教程系列的代码能够在搞代码python对应的github中下载,可本地python环境运行,能迷信上网的宝宝也能够间接借助google colab一键运行与交互操作学习哦!
本教程系列波及的Python速查表能够在以下地址下载获取:
- Python速查表
拓展参考资料
- Python教程—Python3文档
- Python教程-廖雪峰的官方网站
搞代码python相干文章举荐
- python介绍
- python装置与环境配置
- python根底语法
- python根底数据类型
- python运算符
- python条件管制与if语句
- python循环语句
- python while循环
- python for循环
- python break语句
- python continue语句
- python pass语句
- python字符串及操作
- python列表
- python元组
- python字典
- python汇合
- python函数
- python迭代器与生成器
- python数据结构
- python模块
- python文件读写
- python文件与目录操作
- python谬误与异样解决
- python面向对象编程
- python命名空间与作用域
- python工夫和日期
搞代码python系列教程举荐
- 图解Python编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解AI数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程