使用python的os模块,简单方便完成对文件夹、文件及路径的管理与访问操作。

1 前言

在最近开发中,经常需要对文件进行读取、遍历、修改等操作,想要快速、简单的完成这些操作,我选择用 python 。通过 python 的标准内置 os 模块,只需要几行代码,即可完成想要的操作。经过对 os 的使用,本文把 os 模块的常用的操作进行总结,主要分为以下几个划分:

  • 文件夹操作:即文件夹的创建、修改(改名/移动),查询(查看、遍历)、删除等。
  • 文件操作:即文件的创建、修改、读取、删除等。
  • (文件夹/文件)路径操作:即文件夹或文件的路径操作,如绝对路径,文件名与路径分割,扩展名分割等

本文涉及常用 的 os 函数的使用展示,主要使用 python 交互模式下进行代码说明。后续操作默认已经引入 os 模块,如下:

import os复制代码

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python,关注小编,并私信“01”即可进裙,领取python学习资料,会节约很多时间,减少很多遇到的难题。

2 文件夹操作

以本地 E://pythontest 目录作为演示目录,此目录下当前文件如下:

test │ test.txt └─test-1     test-1.txt复制代码

test 及 test-1 是文件夹,test.txt 及 test-1.txt 是文件。

2.1 查询操作

熟悉 linux 同学应该对 ls / pwd / cd 等操作不陌生,对应的 python 也有对应的方法,主要包括:

  • listdir : 文件及目录列表
  • getcwd :获取当前目录
  • chdir :更换目录
  • stat :文件及目录基本信息
  • walk :递归遍历目录
>>> os.chdir("E://pythontest")  # 更改目录>>> os.getcwd()                 # 获取当前目录'E:pythontest'>>> os.listdir("test")          # 文件及目录列表,相对路径['test-1', 'test.txt']          >>> os.listdir("E://pythontest/test")  # 文件及目录列表,绝对路径['test-1', 'test.txt']>>> os.stat("test")             # 获取目录信息os.stat_result(st_mode=16895, st_ino=4503599627377599, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1590833033, st_mtime=1590832647, st_ctime=1590832207)>>> os.stat("test/test.txt")    # 获取文件信息os.stat_result(st_mode=33206, st_ino=2251799813692354, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1590832653, st_mtime=1590832609, st_ctime=1590832598)复制代码

其中 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 获取文件大小,创建时间,修改时间。另外,我们看到输出的时间是秒数,在这里提一下,关于日期的转换处理。

(1)秒数转日期时间格式字符串

>>> import time                              # 引入time模块>>> timestruct = time.localtime(1590803070)  # 转换为时间结构体>>> print(timestruct)time.struct_time(tm_year=2020, tm_mon=5, tm_mday=30, tm_hour=9, tm_min=44, tm_sec=30, tm_wday=5, tm_yday=151, tm_isdst=0)>>> time.strftime("%Y-%m-%d %H:%M:%S",timestruct)   # 格式化时间'2020-05-30 09:44:30'复制代码

(2)格式日期时间字符串转秒数

>>> import datetime               # 引入datetime模块>>> timeobject = datetime.datetime.strptime("2020-05-23 10:00:00","%Y-%m-%d %H:%M:%S") #解析时间字符串为时间对象>>> timeseconds=time.mktime(timeobject.timetuple())  # 获取时间秒数>>> print(int(timeseconds))       # 转为int显示1590199200复制代码
  • 遍历操作 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))...root:testtestest-1testest-2testest.txtroot:testest-1testest-1est-1.txtroot:testest-2testest-2est-2.txt复制代码

2.2 创建操作

  • mkdir :新建单个目录,若目录路径中父目录不存在,则创建失败
  • makedirs :新建多个目录,若目录路径中父目录不存在,则自动创建
>>> os.mkdir("test")>>> os.mkdir("test1/test1-1")          # 父目录不存在,报错Traceback (most recent call last):  File "", line 1, in FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test1-1'>>> os.makedirs("test1/test1-1")       # 父目录不存在,自动创建>>> os.listdir("test1")['test1-1']复制代码

2.3 删除操作

  • rmdir :删除单个空目录,目录不为空则报错
  • removedirs : 按路径删除递归多级空目录,目录不为空则报错
>>> os.rmdir("test1")                         # 若目录不为空,报错Traceback (most recent call last):  File "", line 1, in OSError: [WinError 145] 目录不是空的。: 'test1'>>> os.rmdir("test1/test1-1")>>> os.removedirs("test1/test1-1")            # 删除多级空目录>>> os.listdir(".")['test']复制代码

由于删除空目录的限制,更多的是使用 shutil 模块中的 rmtree 函数,可以删除不为空的目录及其文件。

2.4 修改操作

  • rename :重命名目录或文件,可修改文件或目录的路径(即移动操作),若目标文件目录不存在,则报错。
  • renames :重命名目录或文件,若目标文件目录不存在,则自动创建
>>> os.makedirs("test1/test1-1")>>> os.rename("test1/test1-1","test1/test1-2")     # test1-1 修改为test1-2>>> os.listdir("test1")['test1-2']>>> os.rename("test1/test1-2","test2/test2-2")     # 由于test2目录不存在,报错Traceback (most recent call last):  File "", line 1, in FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test1-2' -> 'test2/test2-2'>>> os.renames("test1/test1-2","test2/test2-2")    # renames可自动创建不存在的目录>>> os.listdir("test2")['test2-2']复制代码

如果目标路径文件已经存在,那么os.rename()和os.renames()都会报错:FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。

3 文件操作

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: 不追踪软链接

3.2 创建操作

前面已提到,使用 open ,指定模式, 若文件不存在,则创建。有点类似 linux 操作中的 touch。

>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)   # 若文件不存在,则创建>>> os.close(f)复制代码

3.3 修改操作

  • open/write/close :写入文件内容
  • rename ,renames : 与前面介绍的修改名称、移动操作一致。
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)     # 打开文件>>> os.write(f,b"test write data")                         # 写入内容15>>> os.close(f)                                   # 关闭文件复制代码

3.4 删除

  • remove :删除文件,注意不能删除目录(使用 rmdir/removedirs)
>>> os.remove("test/test-1")       # 删除目录报错Traceback (most recent call last):  File "", line 1, in FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'test/test1'>>> os.remove("test/test.txt")     # 删除文件>>> os.listdir("test")['test-1']复制代码

4 路径操作

在使用文件或目录过程中,经常需要对文件及目录路径进行处理,因此,os 中有一个子模块 path,专门就是处理路径操作的。主要有以下操作:

  • abspath :返回绝对路径
>>> os.path.abspath("test")'E:pythontestest'复制代码
  • 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")   # 连接两个目录'testest-1'>>> os.path.join("testest-1","test-1.txt")   # 连接目录与文件名'testest-1est-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.tmp") # 以最后的"."为分割点('test/test-1/test-1.txt', '.tmp')复制代码

5 示例应用

下面以一些平时使用到的场景,对前面的操作函数进行综合使用。

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] + "-副本" + splitext[1])复制代码

5.2 遍历目录及子目录下所有指定扩展名的文件

def walk_ext_file(dir_path,ext):    # 遍历    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 ext == file_item[1]:                print(file_path)复制代码

5.3 按修改时间排序指定目录下的文件

def sort_file(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 总结

在需要对文件或者目录进行操作时,python 是一个简单快速选择。本文通过 python 的标准内置 os 模块及子模块 os.path 的常用方法进行介绍,最后结合使用场景进行综合使用。相信已经满足大家对文件及目录操作的大部分需求。

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并私信“01”领取。

python删除文件夹无法访问_零基础小白必看:python基本操作-文件、目录及路径相关推荐

  1. python目录及文件_零基础小白必看:python基本操作-文件、目录及路径

    1 前言 在最近开发中,经常需要对文件进行读取.遍历.修改等操作,想要快速.简单的完成这些操作,我选择用 python .通过 python 的标准内置 os 模块,只需要几行代码,即可完成想要的操作 ...

  2. python代码大全中文注释_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)...

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  3. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  4. python怎么做表格_零基础小白怎么用Python做表格?

    用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件.本文用Python3!在给大家分享之前呢,小编推荐一下一个挺不错的交流宝地,里面都是一群热爱并在学 ...

  5. python编程需要安装什么软件_[零基础学pythyon]安装python编程环境

    注:推荐一种非常重要的学习方法 在我这里看文章的零基础朋友,乃至于非零基础的朋友,不要希望在这里学到很多高深的python语言技巧. "靠,那看你胡扯吗?" 非也.重要的是学会一些 ...

  6. python实现表格_零基础小白怎么用Python做表格?

    用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件.本文用Python3!在给大家分享之前呢,小编推荐一下一个挺不错的交流宝地,里面都是一群热爱并在学 ...

  7. python怎样做表格_零基础小白怎么用Python做表格?

    用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件.本文用Python3!在给大家分享之前呢,小编推荐一下一个挺不错的交流宝地,里面都是一群热爱并在学 ...

  8. Python菜鸟入门基础篇,零基础小白必看

    自从20世纪90年代初发布以来,Python一直相当火爆,在这二十多年里,它的流行程度远远超过了C.C#.Java甚至Javascript. Python为什么受欢迎? Python迅猛发展背后的一个 ...

  9. 零基础小白必看----2020年最新Java学习路线图(纯干货)

    耗掉1024根秀发, 精心整理的Java自学从零基础到进阶中级程序员学习路线各个阶段最佳自学视频! 第一阶段:Java基础 学习路线 学习资源 https://www.bilibili.com/vid ...

最新文章

  1. 《预训练周刊》第22期:Fastformer:加法注意力就是你所需要的、用于蛋白建模的大规模预训练语言模型...
  2. Win7无法安装程序提示Installer integrity check has failed的解决方法
  3. Axure RP一个专业的快速界面原型设计工具
  4. XFTP无法将宿主机文件上传到虚拟机的解决方案
  5. Java并发编程-原子性变量
  6. IOS开发UI篇之──自定义加载等待框(MBProgressHUD)
  7. vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...
  8. Oracle undo 管理
  9. f2fs解析(四)f2fs的extent特性
  10. Win7系统主题路径
  11. excel查看VBA代码快捷键
  12. c语言数组用户注册登入管理系统_[内附完整源码和文档] 基于JAVA的干部档案管理系统...
  13. android 截图 tftp,TFTP全自动智能路由刷固件软件
  14. c语言读取sgy格式文件,用C语言读写SGY格式地震数据文件.pdf
  15. yocto系列讲解[技巧篇]72 - BBCLASSEXTEND变量的作用
  16. 【bioinfo】bbtools:bbmerge 二代测序reads合并工具了解
  17. [项目管理]工业工程理论在软件项目中的实践
  18. MOSFET开通特性(2)——动态特性
  19. Java选择题考试系统
  20. C/C++笔试题(13)

热门文章

  1. java中文转拼音 多音字_java使用jpinyin汉语转拼音(支持多音字)
  2. mysql字符乱码_MySQL字符乱码解决方案
  3. 现在的年轻人。。。到处都是套路。。。
  4. 皮一皮:有一种着急叫做妈妈想你快点脱单...
  5. TIOBE 9月编程语言排行榜
  6. 这个操作稳!云厂商开设免费云计算课程,学员独享49元主机套餐包年!
  7. 你可能会忽略的 Git 提交规范
  8. SpringBoot应用部署于外置Tomcat容器
  9. 使用phpqrcode生成二维码时候显示不正常,有一个小方块
  10. RemoveError: 'setuptools' is a dependency of conda and cannot be removed from