一、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表格等。

如有不对的地方,还请指正!

更多推荐