查看原文
其他

Python教学 | 最常用的标准库之一 —— os

分享技巧的 数据Seminar 2023-05-08
 目录

一、引言

二、如何导入库

三、文件和目录的常用操作

1、获取、更改当前工作目录

2、创建、删除指定路径的目录

四、路径的常用操作

1、绝对路径与相对路径

2、操作文件路径的函数

3、获取文件的目录属性和函数

4、文件扩展名函数

五、文件和目录的遍历方法

1、os.listdir()函数

2、os.walk()函数

六、总结

七、其他内容

1、Python教学

2、文本识别类

3、数据可视化

本文共8606个字,阅读大约需要22分钟,欢迎指正!

Part1引言

标准库是 Python 内置的库,Python 共有 300 多个标准库,这些标准库提供了基础但丰富的功能。在数据处理过程中,尤其是批量处理数据时,不可避免地需要对文件进行读写、重命名等处理,有时还需要进行目录的创建、删除、遍历等操作。Python 中的os模块正是处理这些问题必备的工具库之一。

os全称为Operating System,这个模块提供了与操作系统交互的各种函数,我们可以通过这些函数调用计算机底层操作系统的部分功能来快速、高效地管理文件和目录。os 库在数据处理中一个比较常见的功能是批量读取文件路径。例如我们有一个名为中国环境统计年鉴(1999-2017)的文件夹,其内部还包含了多级文件夹,现在我们想要处理这个文件夹下所有的PDF文件

想要处理所有PDF文件,首先就需要找到这些文件的路径,手动寻找显然比较困难,然而,我们只需要使用os模块便可以轻松获取该文件夹中所有PDF文件的路径。这是os模块常见的功能之一,除此之外,os模块在数据处理中还有其他实用的功能,例如文件/目录操作,路径处理等等,下面我们详细介绍这些内容。

Part2如何导入库

在 Python 中,使用一个库(也称"模块"或"包")中的函数之前,需要先通过import 语句将这个库导入到当前的工作空间,Python 中导入库的方式有以下几种。

方式一:import 库名,使用该方式导入库,可以在当前工作空间中使用该库的所有函数、类、变量等。这种方式适用于需要使用库中大部分功能的情况,示例如下。

# 1.使用 import 语句导入库
import 库名

# 2.当我们需要同时导入多个库时,可以使用如下方式实现
import 库名1,库名2,库名3,...

方式二:from 库名 import 函数名,使用该方式导入库,可以将该库中的一个或多个函数导入到当前工作空间中,直接使用即可。这种方式适用于需要使用库中某些特定功能的情况,示例如下。

# 1.导入该库中指定的方法
from 库名 import 函数名

# 2.下面的方式可以导入该库中所有的方法
from 库名 import *

💡import 库名from 库名 import 函数名这两种方式都可以导入库,但是两者是有区别的。前者会将整个模块导入,并创建一个新的命名空间,访问模块中的函数或变量时,需要使用模块名作为前缀,如module.function()module.variable;后者是将指定的函数或变量导入当前工作空间,不需要使用模块名作为前缀,可以直接访问函数或变量,如function()variable

方式三:import 库名 as ...,使用该方式导入库,可以为库设置一个别名,以方便在程序中使用。这种方式适用于库名称较长,或者需要多次在程序中使用该库的情况

# 为库设置一个别名
import 库名 as 别名

方式四:from 库名 import 函数名 as ...,使用该方式导入库,可以将库中的某个方法导入到当前工作空间中,并且为其设置一个别名,以方便在程序中使用。这种方式适用于只需使用库中某些特定功能,且名称较长的情况

# 导入库中的某个方法,并为其设置别名
from 库名 import 函数名 as 别名

综上,Python 中导入库的方式比较灵活,大家可以根据需要选择最佳的方式,以达到程序简洁易读的目的。

Part3文件和目录的常用操作

在数据处理过程中,经常需要对文件或目录(文件夹)进行读取、创建、删除、重命名等基本操作,os 模块中都有对应的方法完成,常用的函数如下表所示。

上表中的函数常在处理系统文件或目录时发挥作用。比如,我们在数据处理时,需要在当前工作目录创建文件夹或对文件重命名,此时不用在程序之外手动对文件进行更改,直接利用os模块中的函数就可以实现。如os.rename()函数可以用于实现文件的重命名以及文件或文件夹的移动,os.mkdir()函数可以创建单层文件夹,无需手动创建。

1获取、更改当前工作目录

os.getcwd()函数不需要任何参数,调用该函数时,Python 会返回一个字符串,表示 Python 当前的工作路径(Python 当前的工作路径一般为程序文件当前所在目录),示例如下。

如果想要更改当前的工作目录,就需要使用下面介绍的os.chdir()函数。

os.chdir()可以将 Python 的工作目录更改为指定的目录,使得我们可以通过相对路径(下文介绍)访问该目录或其子目录下的文件,简化了工作目录的文件路径。示例如下,Python 工作目录已更改为指定路径。

2创建、删除指定路径的目录

os 模块中,常用于创建和删除目录的函数有以下四个。os.mkdir()函数可以在指定位置创建一个空目录(空文件夹),且只能创建一级目录。如果需要一次性创建多级目录,可以使用os.makedirs()函数。如果需要删除目录,可以使用os.rmdir()os.removedirs()函数。

这些函数在操作文件时经常使用,比如我们想要新建一个文件夹,在程序中只要一行代码就可以实现。如果需要创建多个文件夹,可以使用os.mkdir()函数结合路径的拼接来动态创建目录。如何实现路径的拼接呢?下面我们介绍 Python 中os.path 模块

Part4路径的常用操作

os.path模块 是Python 中处理路径信息的常用模块之一,作为os 模块的一个子模块,通常两者一起用来操作文件和目录。该模块提供了许多实用的功能,常用于获取路径的各种信息、属性;以及拼接路径、分割路径等操作。

1绝对路径与相对路径

在数据处理过程中,经常需要使用文件路径来读取、写入文件或者访问其他资源。Python 中的文件路径分为相对路径和绝对路径。




了解路径,就一定要先了解正斜杠 '/' 和反斜杠 '\'。在 MacOS 和 Linux 系统下,路径默认使用的都是正斜杠'/',在Windows系统下,正反斜杠都可以表示路径分隔符,默认的是反斜杠 '\'。由于反斜杠本身属于转义符,如 '\n' 表示换行符、'\t' 表示横向制表符,这可能会导致使用反斜杠表示的路径在编码时无法被正确识别,如路径'D:\test',在 Python 中,'\test' 中的 '\t' 被识别为制表符,所以该路径无法被找到.

针对这种情况,通常有三种解决办法。

  • 在每个分隔符前加一个反斜杠,原理是先将转义字符转义,例如'D:\\test'
  • 通过非转义的原始字符 'r',在路径字符串前添加 r,例如r'D:\test'
  • 将路径字符串中所有的反斜杠 '\' 改为正斜杠 '/' ,例如'D:/test'


相对路径指的是相对于当前工作目录,定位文件的路径。 比如,我们当前的工作目录为d:\数据Seminar\Python中的os模块,我们想要访问文件1997-2008县市社会经济主要指标.xlsx,该文件位于当前工作目录的子目录示例资源下,那么其相对路径为'示例资源\1997-2008县市社会经济主要指标.xlsx''./示例资源\1997-2008县市社会经济主要指标.xlsx'补充一点,在 Python 文件的相对路径中,最前面的'./'表示当前目录;'../'表示当前目录的上一级目录,可以用于获取父目录中的文件或目录。

绝对路径指的是从根目录开始的完整路径,其不受当前工作目录的影响,始终指向相同的文件或目录。如果我们想要访问刚才的文件,则其绝对路径表示为'D:\数据Seminar\Python中的os模块\示例资源\1997-2008县市社会经济主要指标.xlsx'。需要注意一点,在Windows系统中,文件和文件夹名称不区分大小写。

一般情况下,绝对路径适用于需要确切指定文件位置的情景,而相对路径更适合当前程序与目标文件在同一个工作目录下的情景,路径长度较绝对路径更短。

2操作文件路径的函数

os.path 模块中常用于处理路径字符串的函数如下表所示。

os.path.split(path)函数可以将路径分割为两部分,第一部分为路径字符串最后一个分割符前面的内容,通常为路径目录(dirname),第二部分为路径最后一个分隔符后面的内容,通常为文件名(basename)。该函数返回的是一个二元组(dirname,basename),如果路径没有文件名部分,则返回的 basename 为空字符串。示例如下。

os.path.dirname(path)os.path.basename(path)函数可以分别得到路径字符串最后一个分隔符前、后的内容,它们更适用于只需要得到路径的一个部分,而不用先将路径分割的情形。示例如下。

os.path.join(path1,...)函数用于拼接路径名,在拼接路径名时,我们不需要手动添加路径分隔符,该函数会依据不同的操作系统自动添加正确的路径分隔符(在Windows中为 '\',在Linux和MacOS中为 '/')。

在实际中常见的一个路径操作是,先获取路径的一个部分,再将路径组合拼接为新的路径,可以用于创建、移动、重命名文件或目录。比如我们想要找到中国环境统计年鉴(1999-2017)文件夹中,文件名含有关键字 “2014” 的所有文件,并将文件的路径保存在列表中。代码如下。

# 需要查找文件的文件夹
dir = 'D:\数据Seminar\Python中的os模块\示例资源\中国环境统计年鉴\中国环境统计年鉴(1999-2017)'
# 创建存放结果的列表
list_2014 = list()

# os.listdir()函数遍历指定文件夹,返回包含文件夹中所有文件的列表(将在本期第四部分介绍)
all_files = os.listdir(dir)
# 遍历文件夹中每一个文件
for file in all_files:
    # 拼接一个文件的路径,得到该文件的绝对路径
    file_path = os.path.join(dir, file)
    # 使用os.path.basename()函数获取文件名,判断这个文件的文件名是否含有关键字“2014”
    ## 该语句可以替换为 if “2014” in os.path.split(file_path)[1]:
    if '2014' in os.path.basename(file_path): 
        list_2014.append(file_path)
# 查看最终结果列表
list_2014

os.path.join()函数常与os.path.split()等函数一起使用,通过后者解析路径中的目录或文件部分,使用前者进行动态的路径拼接,避免了手动添加文件路径中的分隔符,同时,在拼接路径名时,还可以使用相对路径或绝对路径,使得程序更加简洁明了。操作文件路径时,还有一个较常用的是os.path.abspath()函数,该函数可以将指定路径转化为绝对路径,这样的好处在于,能够确保访问的是文件的绝对路径,避免了由于相对路径与绝对路径不一致导致的错误,同时也避免了由于操作系统不同导致的路径表达方式不同。

3获取文件和目录属性的函数

除了操作文件路径的函数,os.path 模块还提供了能够获取文件和目录的各种相关属性的函数,下表为其中常用的一些函数。

通常在对文件或目录进行操作前,我们需要先判断指定路径是否指向文件或目录,否则可能会出现错误。比如,我们想要获取某个文件的大小和修改时间,通过以下代码实现。

# 文件的绝对路径
path = r'D:\数据Seminar\Python中的os模块\示例资源\1997~2018县市社会经济主要指标\1997~2018县市社会经济主要指标.xlsx'
# 判断该路径是否指向文件,避免路径错误
if os.path.exists(path):
    # 获取指定文件的大小
    size = os.path.getsize(path)
    # 获取指定文件的修改时间
    mtime = os.path.getmtime(path)
    print(f'文件大小为{size}字节,最后修改时间为{mtime}')
else:
    print('指定路径不存在')

4文件扩展名函数

如本期引言中提到,我们在数据处理时会遇到一种场景,需要对指定文件夹中特定类型的文件进行处理,那么我们应该如何得到文件的类型呢?本节介绍os.path 模块中用于获取文件拓展名的os.path.splitext()函数。

os.path.splitext(path)函数将路径分为文件名和拓展名两部分。参数 path 是要分割的路径字符串,函数返回值为一个二元组,位置一为文件名,位置二为文件的扩展名,如果该路径末尾没有拓展名,则元组的第二个元素为空字符串。这个函数的返回结果有助于我们找到指定类型的文件,比如,我们想要找到指定文件夹下的所有 PDF 文件,并将其路径保存在列表中。代码如下。

# 文件夹的绝对路径
path = r'D:\数据Seminar\Python中的os模块\示例资源'
#用于存放结果的列表
pdf_files = list()

# os.listdir()函数遍历指定文件夹,返回包含文件夹中所有文件的列表(将在本期第四部分介绍)
all_files_name = os.listdir(path)
# 遍历每一个文件
for file_name in all_files_name:
    # 拼接文件的路径
    file_path = os.path.join(path, file_name)
    # 如果文件得到拓展名为'pdf',将其添加到列表中
    if os.path.splitext(file_path)[1] == '.pdf':
        pdf_files.append(file_path)
# 查看最终的结果
pdf_files

这个示例演示了一种常用于找到文件夹中特定类型文件的方法,通常先使用os.listdir()函数(下文介绍)获取目录下的所有文件,然后遍历文件列表,通过os.path.splitext()函数对文件的拓展名进行判断,找到我们需要类型的文件。

Part5文件和目录的遍历方法

在数据处理过程中,我们经常需要遍历一个目录下的所有文件或者子目录,并对其中的文件进行处理,如前文的例子,找到一个文件夹中所有满足要求的文件,这也是对文件进行处理的前提。os 模块中提供了多个函数用于实现文件和目录的遍历,常用的是os.listdir()函数和os.walk()函数。

1os.listdir()函数

os.listdir(path)函数得到一个包含指定目录下所有文件和子目录名称的列表,其中,参数 path 为遍历的目录路径(如果不指定路径,默认为当前工作目录)。在上例中,为找到示例资源文件夹中所有的PDF文件,我们使用os.listdir(path)函数遍历,并将返回的列表赋值给变量all_files_name,代码及列表内容如下。

all_files_name = os.listdir('./示例资源')

上图中红框部分为示例资源文件夹中的子目录,其余为该文件夹中的文件。在此基础上,便可以结合路径操作方法,循环遍历每一个文件。但是这个函数只能返回指定路径的同级子目录名和文件名,返回结果不包含子目录中的文件和目录,如果需要递归遍历目录下所有文件和子目录,应该使用os.walk()函数。

2os.walk()函数

os.walk()函数是一个递归式的遍历(递归遍历是指在遍历目录结构时,对每个子目录都进行一次遍历,从而达到遍历整个目录及其子目录的目的),用于遍历指定目录及其子目录中的所有文件和目录,其语法如下。

os.walk(top, topdown=True, onerror=None, followlinks=False)

其中,参数具体含义如下。

  • top 为要遍历的目录路径。返回的是一个三元组(dirpath,dirnames,filenames),dirpath 为当前遍历的目录树的目录路径,dirnames 为当前目录下所有子目录列表,filenames为当前目录下所有文件列表
  • topdown 为可选参数,为 True 时(默认)表示优先遍历 top目录,即 walk 会遍历 top 文件夹与其每一个子目录。否则会优先遍历 top 的子目录。
  • onerror 为可选的错误处理函数。
  • followlinks为可选参数,为 True 时表示会遍历目录下的快捷方式实际所指的目录,为 False 时(默认)表示优先遍历 top 的子目录。

当我们使用os.walk()函数时,它会从根目录开始遍历整个目录树,并且对于每个目录,都会返回一个三元组。下面我们通过示例了解 os.walk() 函数如何进行递归遍历。

现在我们有一个递归遍历示例文件夹(为方便演示,根目录下只有一级子目录),其文件结构为

可以看到,根目录d:\数据Seminar\Python中的os模块\递归遍历示例文件夹中有两个文件,以及两个子目录,再将其子目录展开,得到如下目录树。

下面使用os.walk()函数遍历目录d:\数据Seminar\Python中的os模块\递归遍历示例文件夹

# 递归遍历该目录
walk_tree = os.walk('D:\数据Seminar\Python中的os模块\递归遍历示例文件夹')

# 从根目录开始遍历整个目录树,每一个目录都会返回一个三元组,使用for循环依次查看结果
for dirpath,dirnames,filenames in walk_tree:
    print('----------当前遍历的目录树的目录路径----------')
    print(dirpath)

    print('----------当前目录下的所有子目录列表----------')
    # 遍历当前目录下所有的子目录
    for dirname in dirnames:
        # 拼接路径,得到子目录的路径
        dir_name = os.path.join(dirpath, dirname)
        print(dir_name)
    
    print('----------当前目录下所有文件列表----------')
    # 遍历当前目录下所有的文件
    for filename in filenames:
        # 拼接路径,得到文件路径
        file_name = os.path.join(dirpath,filename)
        print(file_name)

得到结果如下图所示,第一次循环遍历目录树,结果为红框所示,在当前遍历的根目录下,有两个子目录分别为1997-2018县市社会经济主要指标农林牧渔行业周报,以及两个文件。第二次循环遍历目录树,当前根目录变为d:\数据Seminar\Python中的os模块\递归遍历示例文件夹\1997-2018县市社会经济主要指标(即目录树的根目录下的第一个子目录),得到该目录下所有的文件,且该目录下没有子目录,故为空。同理,得到第三次循环遍历目录树的结果。

通过os.walk()函数,我们可以轻松遍历整个目录树,查找指定路径中我们需要的所有文件或目录,在处理大量数据时更方便。如果只需要查找指定路径的文件,使用os.listdir()函数即可。

Part6总结

本文以批量处理数据为目的,为大家介绍了 Python 标准库 中的os模块及其子模块os.path模块,该模块提供的一系列函数可以让我们轻松实现如文件操作和目录遍历等功能。文中我们重点介绍了操作路径的常用函数以及两个常用的目录遍历函数的用法,这些函数可以基本满足日常的数据处理需求,希望本文内容对大家有所帮助。

Part7其他内容

1Python教学

2文本识别类

3数据可视化



星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧

往期推荐


案例分享:使用 Python 批量处理统计年鉴数据(下)

案例分享:使用 Python 批量处理统计年鉴数据(上)

Python教学 | Python 内置函数

软件应用 | 三阶嵌套Theil-T指数计算与分解的STATA代码



数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存