图解python | 文件与目录操作

简介: 在实际开发中,经常需要对文件夹、文件等进行创建、修改、查询、读取、删除等操作。Python 通过标准内置OS模块,能够以简洁高效的方式完成这些操作。

ShowMeAI研究中心

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


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

我们在实际开发中,经常需要对文件进行读取、遍历、修改等操作,通过 python 的标准内置os模块,能够以简洁高效的方式完成这些操作。常见的操作整理如下:

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

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

import os

Python OS模块知识地图@ShowMeAI

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 "<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/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 "<stdin>", line 1, in <module>
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站查看有【中英字幕】的版本

[video(video-26ZuE8Nw-1645638179290)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=505628451&page=22)(image-https://img-blog.csdnimg.cn/img_convert/71bc3f0a96ddc9376b16f5152655070e.png)(title-【双语字幕+资料下载】Python 3全系列基础教程,全程代码演示&讲解!10小时视频42节,保证你能掌握Python!快来一起跟着视频敲代码~<快速入门系列>)]


资料与代码下载

本教程系列的代码可以在ShowMeAI对应的github中下载,可本地python环境运行,能访问Google的宝宝也可以直接借助google colab一键运行与交互操作学习哦!

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

拓展参考资料

ShowMeAI相关文章推荐

ShowMeAI系列教程推荐

showmeai

目录
相关文章
|
22天前
|
Python
【python】python跨文件使用全局变量
【python】python跨文件使用全局变量
|
30天前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
22 1
|
6天前
|
存储 Python
用Python实现批量下载文件——代理ip排除万难
用Python实现批量下载文件——代理ip排除万难
|
6天前
|
JSON 关系型数据库 数据库
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
33 0
|
6天前
|
数据挖掘 索引 Python
Python 读写 Excel 文件
Python 读写 Excel 文件
11 0
|
6天前
|
数据安全/隐私保护 Python
Python文件与目录操作:面试中的高频考点
【4月更文挑战第15天】本文介绍了Python文件和目录操作的面试重点,包括文件的读写、目录遍历及权限管理。强调了文件关闭、异常处理、特殊文件判断以及权限位和权限字符串的理解。提供了代码示例,如读写文件、遍历目录和更改文件权限,帮助读者在面试中表现出色。掌握这些技能将对编程求职之路大有裨益。
17 0
|
8天前
|
存储 监控 开发工具
对象存储OSS产品常见问题之python sdk中的append_object方法支持追加上传xls文件如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
38 9
|
22天前
|
C++ Python
【C++/Python】C++调用python文件
【C++/Python】C++调用python文件
|
22天前
|
JSON 数据处理 数据格式
Python中的文件读写操作详解
【4月更文挑战第2天】在Python中,文件读写操作是数据处理和程序开发的重要部分。通过文件,我们可以将信息持久化地保存在磁盘上,并在需要时读取和使用这些数据。Python提供了丰富的内置函数和模块,使得文件读写变得简单而高效。本文将详细介绍Python中文件读写的基本操作和常用方法。
|
13天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。

热门文章

最新文章