附实战代码|告别OS模块,体验Python文件操作新姿势!
相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic。但是它不单纯是为了简化操作,还有更大的用途。
pathlib 是Python内置库,Python 文档给它的定义是:The pathlib module – object-oriented filesystem paths(面向对象的文件系统路径)
pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。
更多详细的内容可以参考官方文档:
https://docs.python.org/3/library/pathlib.html#methods
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1156465813
一、Path 类的基本使用
下面是获取文件名、获取文件名除后缀的部分、获取文件后缀、返回一个iterable 包含所有父目录等常用操作示例
1 2 3 4 5 6 7 8 9 10 11 12 13 | from pathlib import Path path = r 'D:\python\pycharm2020\program\pathlib模块的基本使用.py' p = Path(path) print (p.name) # 获取文件名 print (p.stem) # 获取文件名除后缀的部分 print (p.suffix) # 获取文件后缀 print (p.parent) # 相当于dirname print (p.parent.parent.parent) print (p.parents) # 返回一个iterable 包含所有父目录 for i in p.parents: print (i) print (p.parts) # 将路径通过分隔符分割成一个元组 |
运行结果如下:
1 2 3 4 5 6 7 8 9 10 11 | pathlib模块的基本使用.py pathlib模块的基本使用 .py D:\python\pycharm2020\program D:\python <WindowsPath.parents> D:\python\pycharm2020\program D:\python\pycharm2020 D:\python D:\ ( 'D:\\', ' python ', ' pycharm2020 ', ' program ', ' pathlib模块的基本使用.py') |
- Path.cwd()返回表示当前目录的路径对象
- Path.home()返回表示用户主目录的路径对象
- Path.expanduser()返回带有扩展的 ~user 构造的新路径
1 2 3 4 5 6 7 8 | from pathlib import Path path_1 = Path.cwd() # 获取当前文件路径 path_2 = Path.home() p1 = Path( '~/pathlib模块的基本使用.py' ) print (path_1) print (path_2) print (p1.expanduser()) |
运行结果如下:
D:\python\pycharm2020\program
C:\Users\Administrator
C:\Users\Administrator\pathlib模块的基本使用.py
Path.stat()返回一个操作系统统计结果包含有关此路径的信息的对象
1 2 3 4 5 6 7 8 9 10 11 12 | from pathlib import Path import datetime p = Path( 'pathlib模块的基本使用.py' ) print (p.stat()) # 获取文件详细信息 print (p.stat().st_size) # 文件的字节大小 print (p.stat().st_ctime) # 文件创建时间 print (p.stat().st_mtime) # 上次修改文件的时间 creat_time = datetime.datetime.fromtimestamp(p.stat().st_ctime) st_mtime = datetime.datetime.fromtimestamp(p.stat().st_mtime) print (f '该文件创建时间:{creat_time}' ) print (f '上次修改该文件的时间:{st_mtime}' ) |
运行结果如下:
os.stat_result(st_mode=33206, st_ino=3659174698076635, st_dev=3730828260, st_nlink=1, st_uid=0, st_gid=0, st_size=543, st_atime=1597366826, st_mtime=1597366826, st_ctime=1597320585)
543
1597320585.7657475
1597366826.9711637
该文件创建时间:2020-08-13 20:09:45.765748
上次修改该文件的时间:2020-08-14 09:00:26.971164
从不同.stat().st_属性 返回的时间戳表示自1970年1月1日以来的秒数,可以用datetime.fromtimestamp将时间戳转换为有用的时间格式。
- Path.exists()路径是否存在于现有文件或目录
- Path.resolve(strict=False)将路径设为绝对路径,解析任何符号链接。返回一个新的路径对象
1 2 3 4 5 6 7 8 9 10 11 12 | from pathlib import Path p1 = Path( 'pathlib模块的基本使用.py' ) # 文件 p2 = Path(r 'D:\python\pycharm2020\program' ) # 文件夹 absolute_path = p1.resolve() print (absolute_path) print (Path( '.' ).exists()) print (p1.exists(), p2.exists()) print (p1.is_file(), p2.is_file()) print (p1.is_dir(), p2.is_dir()) print (Path( '/python' ).exists()) print (Path( 'non_existent_file' ).exists()) |
运行结果如下:
D:\python\pycharm2020\program\pathlib模块的基本使用.py
True
True True
True False
False True
True
False
- Path.iterdir()当路径指向某个目录时,将生成该目录内容的path对象
1 2 3 4 5 6 | from pathlib import Path p = Path( '/python' ) # python目录下存在的文件 for child in p.iterdir(): print (child) |
运行结果如下:
\python\Anaconda
\python\EVCapture
\python\Evernote_6.21.3.2048.exe
\python\Notepad++
\python\pycharm-community-2020.1.3.exe
\python\pycharm2020
\python\pyecharts-assets-master
\python\pyecharts-gallery-master
\python\Sublime text 3
- Path.glob(pattern)Glob此路径表示的目录中给定的相对模式,生成所有匹配的文件(任何类型),**模式表示递归地此目录和所有子目录。换句话说,它支持递归全局化。
- Note 在大型目录树中使用 **模式可能会耗费大量时间
递归遍历该目录下所有文件,获取所有符合pattern的文件,返回一个generator。
下面是一些常用操作的代码,拿走就用
获取该文件目录下所有.py文件
1 2 3 4 5 6 7 8 | from pathlib import Path path = r 'D:\python\pycharm2020\program' p = Path(path) file_name = p.glob( '**/*.py' ) print ( type (file_name)) # <class 'generator'> for i in file_name: print (i) |
获取该文件目录下所有.jpg图片
1 2 3 4 5 6 7 8 | from pathlib import Path path = r 'D:\python\pycharm2020\program' p = Path(path) file_name = p.glob( '**/*.jpg' ) print ( type (file_name)) # <class 'generator'> for i in file_name: print (i) |
获取给定目录下所有.txt文件、.jpg图片和.py文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from pathlib import Path def get_files(patterns, path): all_files = [] p = Path(path) for item in patterns: file_name = p.rglob(f '**/*{item}' ) all_files.extend(file_name) return all_files path = input ( '>>>请输入文件路径:' ) results = get_files([ '.txt' , '.jpg' , '.py' ], path) print (results) for file in results: print ( file ) |
关于Path.mkdir(mode=0o777, parents=False, exist_ok=False) 的说明
- 在给定的路径上创建一个新目录。如果指定了mode,它将与进程的umask值结合起来,以确定文件模式和访问标志。如果路径已存在,则引发FileExistsError。
- 如果parents参数设置为True,则将根据需要创建此路径的任何缺少的父级;它们是使用默认权限创建的,而不考虑模式(模仿POSIX mkdir-p命令)。
- 如果父项为False(默认值),则缺少父项将引发FileNotFoundError。
- 如果exist_ok为False(默认值),则在目标目录已存在的情况下引发FileExistsError。
- 如果exist_ok为True,则将忽略 FileExistsError 异常(与POSIX mkdir-p命令的行为相同),但仅当最后一个路径组件不是现有的非目录文件时。
在版本3.5中更改:添加了exist_ok参数。
Path.rmdir():删除此目录,目录必须为空。
1 2 3 4 5 | from pathlib import Path p = Path(r 'D:\python\pycharm2020\program\test' ) p.mkdir() p.rmdir() |
1 2 3 4 5 | from pathlib import Path p = Path(r 'D:\python\test1\test2\test3' ) p.mkdir(parents = True ) # If parents is true, any missing parents of this path are created as needed p.rmdir() # 删除的是test3文件夹 |
1 2 3 4 | from pathlib import Path p = Path(r 'D:\python\test1\test2\test3' ) p.mkdir(exist_ok = True ) |
- Path.unlink()(missing_ok=False):删除此文件或符号链接。如果路径指向目录,请使用Path.rmdir()代替。如果missing_ok为False(默认值),则在路径不存在的情况下引发FileNotFoundError。如果missing_ok为true,则将忽略FileNotFoundError异常。在版本3.8中更改:添加了缺少的“确定”参数。
- Path.rename()(target):将此文件或目录重命名为给定目标,并返回指向目标的新路径实例。在Unix上,如果目标存在并且是一个文件,如果用户有权限,它将被无提示地替换。目标可以是字符串或其他路径对象。
- Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None):打开路径指向的文件,就像内置的 open() 函数一样。
1 2 3 4 5 6 7 8 9 | from pathlib import Path p = Path( 'foo.txt' ) p. open (mode = 'w' ).write( 'some text' ) target = Path( 'new_foo.txt' ) p.rename(target) content = target. open (mode = 'r' ).read() print (content) target.unlink() |
二、与os模块用法的对比
三、实战案例
对于多层文件夹的读取,用os模块只能一层一层读取出文件,要写多个for循环,效率不高,这时我们可以用 Path.glob(**/*) 大法,下面以一个实际案例来体验它的强大。
用于测试的文件夹如下:
md文件中数据如下:
需要实现将该目录下所有 md 文件的数据提取出来,并进行清洗,然后写入 csv 文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # -*- coding: UTF-8 -*- from pathlib import Path import re import pandas as pd # 传入路径 p = Path(r '.\微博热搜数据\热搜数据/' ) # 得到该文件目录下所有 .md文件 file_list = list (p.glob( '**/*.md' )) print (f '读取md文件数量:{len(file_list)}' ) for item in file_list: print (item) # 每天有两条热搜汇总 11点 23点 会有重合数据 去重 filelist = list ( filter ( lambda x: str (x).find( '23点' ) > = 0 , file_list)) sum_list = [] i = 0 for file in filelist: # 遍历出每一个md文件 读取数据 with file . open (encoding = 'utf-8' ) as f: lines = f.readlines() lines = [i.strip() for i in lines] # 去除空字符 data = list ( filter ( None , lines)) # 去除掉列表中的空子串 data = data[ 1 : 101 ] con = data[:: 2 ] # 热搜内容 rank = data[ 1 :: 2 ] # 热度 date = re.findall( '年(.+)2' , str ( file )) * len (con) for m in range ( len (con)): con[m] = con[m].split( '、' )[ - 1 ] # 字符串操作 for n in range ( len (rank)): rank[n] = re.findall(r '\d+' , rank[n])[ 0 ] con_dic = { '日期' : date, '热搜内容' : con, '热度' : rank} df = pd.DataFrame(con_dic) if i = = 0 : df.to_csv( 'weibo1.csv' , mode = 'a+' , index = False , header = True ) else : df.to_csv( 'weibo1.csv' , mode = 'a+' , index = False , header = False ) # 每个md文件中有50条数据 i + = 50 print ( '共{}条数据写入csv' . format (i)) |
运行效果如下:
可以看到成功将该目录下所有 md 文件的数据提取出来,并进行清洗,然后写入了 csv 文件中。
注意:如果你是打算找python高薪工作的话。我建议你多写点真实的企业项目积累经验。不然工作都找不到,当然很多人没进过企业,怎么会存在项目经验呢? 所以你得多找找企业项目实战多练习下撒。如果你很懒不想找,也可以进我的Python交流圈:1156465813。群文件里面有我之前在做开发写过的一些真实企业项目案例。你可以拿去学习,不懂都可以在裙里找我,有空会耐心给你解答下。
以下内容无用,为本篇博客被搜索引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是干什么的 零基础学 python 要多久 python 为什么叫爬虫
python 爬虫菜鸟教程 python 爬虫万能代码 python 爬虫怎么挣钱
python 基础教程 网络爬虫 python python 爬虫经典例子
python 爬虫
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上内容无用,为本篇博客被搜索引擎抓取使用
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!