热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于python:图解python-文件与目录操作

咱们在理论开发中,常常须要对文件进行读取、遍历、批改等操作,通过python的规范内置os模块,可能以简洁高效的形式实现这些操作。常见的操作整顿如下:

作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tuto…
本文地址:http://www.showmeai.tech/article-detail/86
申明:版权所有,转载请分割平台与作者并注明出处


1.Python文件目录操作与OS模块

咱们在理论开发中,常常须要对文件进行读取、遍历、批改等操作,通过 python 的规范内置os模块,可能以简洁高效的形式实现这些操作。常见的操作整顿如下:

  • 文件夹操作:包含文件夹的创立、批改(改名/挪动),查问(查看、遍历)、删除等。
  • 文件操作:包含文件的创立、批改、读取、删除等。
  • 门路操作:文件夹或文件的门路操作,如绝对路径,文件名与门路宰割,扩展名宰割等

要实现文件与目录的操作,首先导入对应的os模块,代码如下:

import os

2.文件夹操作

以本地 pythontest 目录作为演示目录,此目录下以后文件如下:

test
 │ test.txt
 └─test-1
     test-1.txt

testtest-1 是文件夹,test.txttest-1.txt 是文件。

(1)查问操作

linux中咱们应用ls / pwd / cd 等实现查问与切换门路等操作,对应的python操作方法如下:

  • listdir : 文件及目录列表
  • getcwd :获取当前目录
  • chdir :更换目录
  • stat :文件及目录根本信息
  • walk :递归遍历目录
>>> os.chdir("./pythontest")  # 更改目录
>>> os.getcwd()                 # 获取当前目录
'/Users/ShowMeAI/pythontest'
>>> os.listdir("test")          # 文件及目录列表,相对路径
['test-1', 'test.txt']          
>>> os.listdir("/Users/ShowMeAI/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 "", line 1, in 
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 "", line 1, in 
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 "", line 1, in 
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/ShowMeAI.txt", os.O_RDWR|os.O_CREAT)   # 若文件不存在,则创立
>>> os.close(f)

(3)批改操作

  • open/write/close :写入文件内容
  • rename,renames : 与后面介绍的批改名称、挪动操作统一。
>>> f = os.open("test/ShowMeAI.txt", os.O_RDWR|os.O_CREAT)     # 关上文件
>>> os.write(f,b"ShowMeAI test write data")                         # 写入内容
15
>>> os.close(f)                                   # 敞开文件

(4)删除

  • remove :删除文件,留神不能删除目录(应用 rmdir/removedirs)
>>> os.remove("test/test-1")       # 删除目录报错
Traceback (most recent call last):
  File "", line 1, in 
FileNotFoundError: 零碎找不到指定的文件。: 'test/test1'
>>> os.remove("test/ShowMeAI.txt")     # 删除文件
>>> os.listdir("test")
['test-1']
4.门路操作

在应用文件或目录过程中,常常须要对文件及目录门路进行解决,因而,os 中有一个子模块 path,专门就是解决门路操作的。次要有以下操作:

  • abspath :返回绝对路径
>>> os.path.abspath("test")
'/Users/ShowMeAI/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] + "-ShowMeAI" + 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…

材料与代码下载

本教程系列的代码能够在ShowMeAI对应的github中下载,可本地python环境运行,能迷信上网的宝宝也能够间接借助google colab一键运行与交互操作学习哦!

本教程系列波及的Python速查表能够在以下地址下载获取:

  • Python速查表
拓展参考资料
  • Python教程—Python3文档
  • Python教程-廖雪峰的官方网站
ShowMeAI相干文章举荐
  • 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工夫和日期
ShowMeAI系列教程举荐
  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程


推荐阅读
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文详细探讨了Java事件处理机制的核心概念与实现原理,内容浅显易懂,适合初学者逐步掌握。通过具体的示例和详细的解释,读者可以深入了解Java事件模型的工作方式及其在实际开发中的应用。 ... [详细]
author-avatar
feify_fei512_478
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有