Python学习:os模块之文件处理
一、os模块
os模块简介
os模块是Python的一个内置标准库,不需要额外安装。
os模块是主要用于与操作系统交互的核心模块,提供跨平台的系统功能接口,包括文件/目录操作、进程管理、环境变量访问等。可兼容不同操作系统(Windows、Linux、macOS)。
这篇笔记主要记录文件/目录操作的用法。
二、常用函数
1、os.getcwd()
获取当前所在目录
E:\ 盘中创建了一个 os_path 的文件夹,进入文件夹中后右键运行终端,在终端中运行 python,通过 os.getcwd() 可获取到当前所在的文件夹

2、os.chdir()
切换目录

3、os.listdir()
获取当前目录下的所有内容,包括文件夹、文件

在 E:\os_path_2 这个目录下的内容为:
test:是一个子目录
test.txt
test_excel.slsx
4、os.path.isfile()、os.path.isdir()
通过os.listdir()获取到当前目录下的所有内容后如何判断其是文件还是目录?
os.path.isfile() :判断目标是否为文件
os.path.isdir() :判断目标是否为目录
此时可使用fow循环来逐个判断:

5、os.mkdir()、os.makedirs()
os.mkdir() :创建一个目录,只能在指定的目录中创建一层文件夹。
在 os_path_2 目录下创建一个 test_2 的目录,通过os.listdir()、os.path.isdir()来获取相应的内容。

os.makedirs() :可一次性创建整条路径上的所有文件夹。
在 E:\os_path_2\test 子目录下再创建一个 next_file 的子目录,并在 next_file 的子目录中再创建一个 test2 子目录

在使用 os.makedirs()时,一定要加入一个参数:exist_ok=True,它的作用是如果路径中间有的目录已经存在则忽略报错,如果已经存在则创建,避免报错!
6、os.rmdir()
删除空目录
只能删除空目录,如果目录中有文件则无法删除

7、os.remove()
删除文件

8、os.path.join()
拼接路径
很多时候在对文件进行操作时都需要获取文件的相对或绝对路径。
那么文件完整路径可通过 os.path.join()进行拼接
格式:
os.path.join('path', 'file_name')
在这个示例中现学现用,通过 os.getcwd() 获取到当前所在目录,直接传入 os.path.join()实现拼接

9、os.path.basename()
获取文件名
包括文件后缀(即扩展名),不包括路径
请看下面的例子,通过这个例子复习一下以前的知识

在 file_path_1、file_path_3、file_path_4中将相同的路径分类赋值给不同的变量。在执行后结果显示均一样。但在 file_path_2 中,显示的结果和前面有所不同。
字符串的表示方式:单引号、双引号、三引号。
\ :在Python中,它还是 转义符,当它和特定的字符组合时代表着特殊的含义
常见的组合:
\t :制表符,即 Tab键
\n :换行符,即 回车键
\r :回车符,把光符移动到行首
\b :退格符,即 删除键
\f :换页符
\v :垂直制表符
\a :响铃符
在使用单引号、双引号或三引号表示一个字符串时,Python解释器只要看到 \ ,就会默认 \ 后面跟着特殊字符,需要将这个字符翻译成特殊符号,在 'E:\os_path_2\text.txt' 中,第一个 \ 后接的是 o,对于 \o 没有特殊含义,则保留原有字符串,而第二个 \ 后接的是 t,会被视为 一个制表符,最后解释器在理解它时的结果就是:
E:\os_path_2 + [Tab] + ext.txt
os.path.basename() 的规则:找到路径中最后一个 \,然后将 \ 之前的所有内容全部删除,只保留 \ 之后的内容。
解释器环境
当我们直接在交互环境输入 os.path.basename(file_path_1)或 os.path.basename(file_path_3)或 os.path.basename(file_path_4)时,它会将原始的未经过解析的代码串显示出来。即写进去的是 'E:\os_path_2\text.txt' 显示的也是它。
print()函数
当使用print()时,它会将字符串两边的单引号、双引号或三引号去掉,显示的结果就会有不同。
那么如果写成 'E:\\os_path_2\\text.txt' 是否可以?
当然可以!
r'' 或 r""
原始字符串
当写成 r"E:\os_path_2\text.txt" 时,则会直接将 E:\os_path_2\text.txt 示为一个整体,中间 \ 只作为普通的 \ ,没有转义符的作用。
10、os.path.dirname()
获取文件所在目录

11、os.path.splitext()
获取文件名和文件后缀
它不关心给传入的是一个完整路径还是只是文件名,它只查找最后一个 .
因此如果你传入的内容不同,显示的结果也会不同

三、举例
在 E:\os_path_2\下有一个test的子目录和一个test.txt的文件,而在test的子目录还有一个 test_2.txt的文件,那么如何获取 E:\os_path_2 目录下包括子目录中的所有文件的名称以及其路径呢?
首先获取 E:\os_path_2\ 目录下的所有内容,再获取 test 子目录下的内容。

这样获得完整路径的方式是不是很麻烦。那么有没有更方便的方法?
当前有,结合之前学习的自定义函数、for 循环、if 判断来处理
import os
# 定义一个变量 soucrce_path 存放目标文件夹
source_path = r"E:\os_path_2"
# 定义一个函数 get_file_name
def get_file_name(path):
"""
获取文件名,文件所在目录,文件完整路径
:param path: 目标文件夹
:return: None
"""
# 遍历目标文件夹
for i in os.listdir(path):
# 获取文件完整路径
full_path = os.path.join(path, i)
# 判断是否是文件夹
if os.path.isdir(full_path):
# 递归调用 函数自身
get_file_name(full_path)
# 获取文件名,文件所在目录,文件完整路径
else:
# 获取文件所在目录
dir_path = os.path.dirname(full_path)
# 打印结果
print(f"文件名:{i} == 文件路径:{dir_path} == 文件完整路径:{full_path}")
# 调用函数
get_file_name(source_path)
看一下结果:
![]()
四、os.walk()
接下来我们单独说一下 os.walk() 函数。
根据官方文档的说明来理解:
os.walk(top, topdown=True, οnerrοr=None, followlinks=False)
生成目录树中的文件名,方式是 自上而下 或 自下而上 按顺序浏览目录树。对于以 top 为根的目录树中的每个目录(包括 top 本身),它都会生成一个三元组(dirpath, dirnames, filenames):
dirpath :是一个字符串,表示目录的路径
dirnames :是由 dirpath 中的子目录名称组成的列表
filenames :是由 dirpath 中非目录文件名称组成的列表
topdown:可选参数,控制遍历的方向
True:为自上而下,即先处理当前目录,再进入子目录,默认
False:自下而上,先递归进入所有子目录,处理完最底层的目录后,再往上一级目录进行处理
onerror:可选参数,处理遍历中的错误
指定一个函数来处理遍历中出现的异常
默认:None,表示忽略异常,或由Python默认处理,遇到无法处理的文件夹时,os.walk() 可能会报错并停止
followlinks:可选参数,是否追踪“快捷方式”
决定是否进入 快捷方式 指向的实际目录
默认:False,不进入,只把快捷方式作为一个普通文件处理
先看一个示例:

在第一次遍历主目录时:
dirpath 为 E:\os_path_2
dirnames 为 ['test']
filenames 为 ['test.txt']
在第二次遍历子目录时:
dirpath 为 E:\os_path_2\test
dirnames 为 []
filenames 为 ['test_2.txt']
在每次遍历一个目录时,均会代入三元组,如果该项为空,也会传入,只不过返回的是空值。
如何获取:文件名 == 文件所在路径 == 文件完整路径呢?
import os
for dirpath, dirnames, filenames in os.walk(r"E:\os_path_2"):
for i in filenames:
full_path = os.path.join(dirpath, i)
dirname_path = os.path.dirname(full_path)
print(f"文件名称:{i} == 文件路径:{dirname_path} == 文件完整路径:{full_path}")
运行结果:
![]()
相对于自定义函数 get_file_name(path) 来说,os.walk()是专门来处理文件路径的函数,只需要将目标主路径传入,其会自动处理,代码简单很多。
五、os模块的其他函数
1、os.path.getsize()
当确定一个目标是文件后,可通过 os.path.getsize() 来获取该文件的大小,默认为单位为:字节
如果传入的目录是一个目录,则无法正确获取到目录的大小,得到的结果为 0

2、os.path.getmtime()
获取文件最后的修改时间
3、os.path.getctime()
获取文件创建时间
4、os.path.getatime()
获取文件最后访问时间
5、os.path.exists()
判断文件是否存在
6、os.path.islink()
检测文件是否为链接
7、os.chmod()
修改文件权限
8、os.path.split()
将文件的完整路径拆分为文件所在的目录和文件名称。等同于 os.path.dirname() 和 os.path.basename() 的合体。
以上为 os 模块处理文件的部分常用函数。通过这些函数基本可以完成日常的工作需要。
对于一些复杂情况的处理,可能还需要其他模块的支持,如遍历出所有文件及其路径后将所有结果写入Excel表格等。
如有不对的地方,还请指正!
更多推荐
所有评论(0)