python os.path 模块详解

os.path.basename()   返回最后一项,通常是文件名
os.path.dirname()    返回的是目录,不包含文件名
os.path.split()    返回元祖包含:目录和文件名
os.path.join(path1,path2,...)   合并组合为一个完整的路径,返回字符串
os.path.splitext()    返回C:\Users\Jack\Desktop\test  和 .pdf
os.listdir()    只返回当前文件夹里面看得见的文件夹和文件,不遍历
os.walk()    返回当前文件夹里面的所有,遍历

文件夹为:C:\Users\jack\Desktop\test\
文件夹里面的文件有:case1.py, case2.py, case3.py
所以case1.py的总文件路径为:C:\Users\jack\Desktop\test\case1.py path = "C:\Users\jack\Desktop\test\"
files = os.listdir(path)
那么files 输出为[ case1.py, case2.py, case3.py ]

for file in files:
此时的 file 就是 case1.py
file_path = os.path.join(path, file) 此时的file_path 就是case1.py的总文件路径:C:\Users\jack\Desktop\test\case1.py
dir_name = os.path.dirname(file_path) 相当于 dir_name = os.path.split(file_path)[0] 输出 C:\Users\jack\Desktop\test\
base_name = os.path.basename(file_path) 相当于 dir_name = os.path.split(file_path)[1] 输出 case1.py os.path.splitext(file_path) 输出 [ 'C:\Users\jack\Desktop\test\case1', '.py' ]

1,在实际中常见的一个路径操作是,先获取路径的一个部分,再将路径组合拼接为新的路径,可以用于创建、移动、重命名文件或目录。比如我们想要找到中国环境统计年鉴(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()函数,该函数可以将指定路径转化为绝对路径,这样的好处在于,能够确保访问的是文件的绝对路径,避免了由于相对路径与绝对路径不一致导致的错误,同时也避免了由于操作系统不同导致的路径表达方式不同。

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

# 文件的绝对路径
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('指定路径不存在')

3,如本期引言中提到,我们在数据处理时会遇到一种场景,需要对指定文件夹中特定类型的文件进行处理,那么我们应该如何得到文件的类型呢?本节介绍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()函数对文件的拓展名进行判断,找到我们需要类型的文件。

4,os.listdir()函数

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

all_files_name = os.listdir('./示例资源')   返回的 all_files_name 是一个列表

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

5,os.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模块\递归遍历示例文件夹

os.walk(path) 返回的是一个三元组(dirpath,dirnames,filenames),dirpath 为当前遍历的目录树的目录路径,dirnames 为当前目录下所有子目录列表,filenames为当前目录下所有文件列表。
# 递归遍历该目录
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()函数即可。

python os.path 模块详解的更多相关文章

  1. 转载的:Python os 和 os.path模块详解

    os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdi ...

  2. python标准库介绍——2 os.path模块详解

    == os.path 模块 == ``os.path`` 模块包含了各种处理长文件名(路径名)的函数. 先导入 (import) ``os`` 模块, 然后就可以以 ``os.path`` 访问该模块 ...

  3. (转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  4. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  5. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  6. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

  7. Node入门教程(8)第六章:path 模块详解

    path 模块详解 path 模块提供了一些工具函数,用于处理文件与目录的路径.由于windows和其他系统之间路径不统一,path模块还专门做了相关处理,屏蔽了彼此之间的差异. 可移植操作系统接口( ...

  8. 【308】Python os.path 模块常用方法

    参考:Python os.path 模块 参考:python3中,os.path模块下常用的用法总结 01   abspath 返回一个目录的绝对路径. 02   basename 返回一个目录的基名 ...

  9. Python的logging模块详解

          Python的logging模块详解 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志级别 日志级别指的是产生的日志的事件的严重程度. 设置一个级别后,严重程度 ...

  10. python os.path模块常用方法详解

    os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法.更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.ht ...

随机推荐

  1. LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

    LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent ...

  2. NumPy 均匀分布模拟及 Seaborn 可视化教程

    均匀分布 简介 均匀分布是一种连续概率分布,表示在指定范围内的所有事件具有相等的发生概率.它常用于模拟随机事件,例如生成随机数或选择随机样本. 参数 均匀分布用两个参数来定义: a:下限,表示分布的最 ...

  3. NOIP模拟60

    T1 整除 解题思路 答案就是 n 的每一个质因数的合法的答案数相乘(证明的话就....) 但是复杂度显然不允许(虽然我们可以给指数取模水过去).. 可以用积性筛(线性筛)利用质数筛出 \(x^m\) ...

  4. css 文本换行的问题

    今天测试再测试功能的时候无意间发现了这个css的bug,我们可以仔细看第一张图的最后两行,明明还没有到结尾就自动换到最后一行去了,按理说应该是撑满当前行再挤到下一行去,于是我就去看了下css的文本溢出 ...

  5. webpack代码分割

    在做一些单页应用中,若不做任何处理,所有项目文件会打包为一个文件,这个文件非常的大,造成网页在首次进入时比较缓慢.做了代码分割后,会将代码分离到不同的chunk中,然后进行按需加载这些文件,能够提高页 ...

  6. ETL工具-nifi干货系列 第十七讲 nifi Input Port&Out Port 实战教程

    1.端口(Port),包含输入端口(Input Port)和输出端口(Out Port ) 使用一个或多个处理组构建的数据流需要一种方式将处理组连接到其他数据流组件. 处理组和处理组之间可以通过使用端 ...

  7. INFINI Console 与华为鲲鹏完成产品兼容互认证

    何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...

  8. Easysearch 容量规划建议

    基于容量估算 主要问题: 每天将索引多少原始数据(GB)?保留数据多少天? 原始数据膨胀率 您将强制执行多少个副本分片? 您将为每个数据节点分配多少内存? 您的内存:数据比例是多少? 原则 保留 +1 ...

  9. 副本集replicaSet

    mongodb高可用架构 https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/ 复制是跨多个服务器同步数据的过程. 复制提供 ...

  10. 使用vue-contextmenujs鼠标右键菜单时,当高度不够时显示不全的问题

    之前是采用npm或者yarn直接装包vue-contextmenujs的形式: npm install vue-contextmenujs -S || yarn add vue-contextmenu ...