python rpa_(RPA学习)Python 之 Pathlib 模块
原标题:(RPA学习)Python 之 Pathlib 模块
艺赛旗 RPA9.0全新首发免费下载 点击下载
http://www.i-search.com.cn/index.html?from=line9
读文件和写文件
在我们使用 open 来操作文件读写操作的时候, 不仅可以使用字符串格式的路径,对于 pathlib 生成的路径完全可以直接使用:
path = pathlib.Path.cwd() / 'test.md'
with open(path, mode='r') as fid:
headers = [line.strip() for line in fid if line.startswith('#')]
print('\n'.join(headers))
或者在 pathlib 的基础使用 open, 我推荐使用下面的方式:
import pathlib
DIR_PATH = pathlib.Path("/Users/chennan/CDM") / "2000" / "hehe.txt"
with DIR_PATH.open("r") as fs:
data = fs.read()
print(data)
这样写的好处就是 open 里面我们不需要再去传入路径了,直接指定文件读写模式即可。实际上这里的 open 方法,底层也是调用了 os.open 的方法。使用哪种方式看个人的喜好。
pathlib 还提供几种文件的读写方式:
可以不用再使用 with open 的形式即可以进行读写。
.read_text(): 找到对应的路径然后打开文件,读成str格式。等同open操作文件的"r"格式。
.read_bytes(): 读取字节流的方式。等同open操作文件的"rb"格式。
.write_text(): 文件的写的操作,等同open操作文件的"w"格式。
.write_bytes(): 文件的写的操作,等同open操作文件的"wb"格式。
使用 resolve 可以通过传入文件名,来返回文件的完整路径,使用方式如下
import pathlib
py_path =pathlib.Path("superdemo.py")
print(py_path.resolve())
输出
/Users/chennan/pythonproject/demo/superdemo.py
需要注意的是 "superdemo.py" 文件要和我当前的程序文件在同一级目录。
选择路径的不同组成部分
pathlib 还提供了很多路径操作的属性,这些属性可以选择路径的不用部位,如
.name: 可以获取文件的名字,包含拓展名。
.parent: 返回上级文件夹的名字
.stem: 获取文件名不包含拓展名
.suffix: 获取文件的拓展名
.anchor: 类似盘符的一个东西,
import pathlib
now_path = pathlib.Path.cwd() / "demo.txt"
print("name",now_path.name)
print("stem",now_path.stem)
print("suffix",now_path.suffix)
print("parent",now_path.parent)
print("anchor",now_path.anchor)
输出:
name demo.txt
stem demo
suffix .txt
parent /Users/chennan/pythonproject/demo
anchor /
移动和删除文件
当然 pathlib 还可以支持文件其他操作,像移动,更新,甚至删除文件,但是使用这些方法的时候要小心因为,使用过程不用有任何的错误提示即使文件不存在也不会出现等待的情况。
使用 replace 方法可以移动文件,如果文件存在则会覆盖。为避免文件可能被覆盖,最简单的方法是在替换之前测试目标是否存在。
import pathlib
destination = pathlib.Path.cwd() / "target"
source = pathlib.Path.cwd() / "demo.txt"
if not destination.exists():
source.replace(destination)
但是上面的方法存在问题就是,在多个进程多 destination 进行的操作的时候就会现问题,可以使用下面的方法避免这个问题。也就是说上面的方法适合单个文件的操作。
import pathlib
destination = pathlib.Path.cwd() / "target"
source = pathlib.Path.cwd() / "demo.txt"
with destination.open(mode='xb') as fid:
#xb表示文件不存在才操作
fid.write(source.read_bytes())
当 destination 文件存在的时候上面的代码就会出现 FileExistsError 异常。
从技术上讲,这会复制一个文件。 要执行移动,只需在复制完成后删除源即可。
使用 with_name 和 with.shuffix 可以修改文件名字或者后缀。
import pathlib
source = pathlib.Path.cwd() / "demo.py"
source.replace(source.with_suffix(".txt")) #修改后缀并移动文件,即重命名
可以使用.rmdir()和.unlink() 来删除文件。
几个 pathlib 的使用例子
统计文件个数
我们可以使用.iterdir 方法获取当前文件下的所以文件.
import pathlib
from collections import Counter
now_path = pathlib.Path.cwd()
gen = (i.suffix for i in now_path.iterdir())
print(Counter(gen))
输出:
Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1})
通过配合使用 collections 模块的 Counter 方法,我们获取了当文件夹下文件类型情况。
前面我们说过 glob 模块点这里了解【glob 模块的使用】,同样的 pathlib 也有 glob 方法和 rglob 方法,不同的是 glob 模块里的 glob 方法结果是列表形式的,iglob 是生成器类型,在这里 pathlib 的 glob 模块返回的是生成器类型,然后 pathlib 还有一个支持递归操作的 rglob 方法。
下面的这个操作我通过使用 glob 方法,设定规则进行文件的匹配。
import pathlib
from collections import Counter
gen =(p.suffix for p in pathlib.Path.cwd().glob('*.py'))
print(Counter(gen))
展示目录树
下一个示例定义了一个函数 tree(),该函数的作用是打印一个表示文件层次结构的可视树,该树以一个给定目录为根。因为想列出其子目录,所以我们要使用.rglob() 方法:
import pathlib
from collections import Counter
def tree(directory):
print(f'+ {directory}')
for path in sorted(directory.rglob('*')):
depth = len(path.relative_to(directory).parts)
spacer = ' ' * depth
print(f'{spacer}+ {path.name}')
now_path = pathlib.Path.cwd()
if __name__ == '__main__':
tree(now_path)
其中 relative_to 的方法的作用是返回 path 相对于 directory 的路径。
parts 方法可以返回路径的各部分。例如
import pathlib
now_path = pathlib.Path.cwd()
if __name__ == '__main__':
print(now_path.parts)
返回:
('/', 'Users', 'chennan', 'pythonproject', 'demo')
获取文件最后一次修改时间
iterdir(),.glob() 和.rglob() 方法非常适合于生成器表达式和列表理解。
使用 stat()方法可以获取文件的一些基本信息,使用.stat().st_mtime 可以获取文件最后一次修改的信息
import pathlib
now_path = pathlib.Path.cwd()
from datetime import datetime
time, file_path = max((f.stat().st_mtime, f) for f in now_path.iterdir())
print(datetime.fromtimestamp(time), file_path)
甚至可以使用类似的表达式获取上次修改的文件内容
import pathlib
from datetime import datetime
now_path =pathlib.Path.cwd()
result = max((f.stat().st_mtime, f) for f in now_path.iterdir())[1]
print(result.read_text())
.stat().st_mtime 会返回文件的时间戳,可以使用 datetime 或者 time 模块对时间格式进行进一步转换
其他内容
关于 pathlib.Path 格式路径转换为字符串类型
因为通过 pathlib 模块操作生成的路径,不能直接应用字符串的一些操作,所以需要转换成字符串,虽然可以使用 str()函数进行转换,但是安全性不高,建议使用 os.fspath() 方法,因为如果路径格式非法的,可以抛出一个异常。str() 就不能做到这一点。
拼接符号 "/" 背后的秘密
/ 运算符由 __truediv__()方法定义。 实际上,如果你看一下 pathlib 的源代码,你会看到类似的东西。
class PurePath(object):
def __truediv__(self, key):
return self._make_child((key,))
后记
从 Python 3.4 开始,pathlib 已在标准库中提供。 使用 pathlib,文件路径可以由适当的 Path 对象表示,而不是像以前一样用纯字符串表示。 这些对象使代码处理文件路径:
更容易阅读,特别是可以使用“/”将路径连接在一起
更强大,直接在对象上提供最必要的方法和属性
在操作系统中更加一致,因为 Path 对象隐藏了不同系统的特性返回搜狐,查看更多
责任编辑:
python rpa_(RPA学习)Python 之 Pathlib 模块相关推荐
- python浮点数保留两位小数_(RPA)学习——Python 保存两位小数
原标题:(RPA)学习--Python 保存两位小数 解释 python 由于 float 方法的浮点数处理精度不足导致,处理或者保存小数的时候可能出现不准准确的请款 python 的 round在保 ...
- 为什么学习Python?选择学习Python的10个理由
前言 为什么学习Python?选择学习Python的10个理由 Python提供了许多有用的功能特性,这些功能使其相比其他编程语言更流行也更易于学习.它支持面向对象的编程,也支持面向过程编程:我们在下 ...
- 学习Python编程基础学习笔记(5.模块和包)
目录 一:概述 1.1标准模块 二:模块详解 2.1以脚本方式执行模块 6.1.2. 模块搜索路径 6.1.3. "已编译的" Python 文件 三:dir() 函数 和 包 3 ...
- python自学时间-学习Python、Python时间操作有哪些?
一.背景知识介绍: 1.时间是人类规定的产物,与长度单位是一个道理,米这个单位也是人类发明的.简单说就是地球自转1圈为1天,地球饶太阳公转1圈为1年,而且根据公转自转度量时间都是不可靠的(因为非匀速无 ...
- python基础教程-学习python有什么好的视频教程?
干货来袭,以下均为python好的学习视频,我们先从python的入门教程开始分享起! python入门教程(600集)https://www.bilibili.com/video/BV1ex411x ...
- 怎样学好python编程-怎样学习python编程?
什么是Python? 在过去的2017年里,Python开发者在全球快速增长,国内小伙伴学习 Python 的热情一路高涨.同时,PYPL发布7月编程语言指数榜,Python 在今年5月首次超越 Ja ...
- 从C#到Python——谈谈我学习Python一周来的体会
前段时间开始学Python,到现在正好一个星期了,谈谈我的学习体会. 一.学习缘起 最早听说Python是在今年1月底到北京一个厂商(做汽车驾驶模拟器的)那里看设备,听他们的CTO介绍模拟软件的脚本控 ...
- 0035【Python】小白学习Python大纲
后续业余时间慢慢补充学习详细内容. Python介绍 Python是一种解释型语言,面向对象语言 Python的解释器分类: CPython(官方):用c语言编写的Python解释器 pypy:pyt ...
- 学python的书-学习python求推荐一波书籍?
豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6) />Many programmers who learn Python basics fall in ...
- 如何快速学习python,怎么学习Python
如果您想学习Python,首先您需要明确Python的基本概念和语法规则,这些都是您学习编程的基础.Python作为一门高级编程语言,在数据分析.人工智能等领域越来越受欢迎.因此,学习Python能够 ...
最新文章
- sqlite database is locked 问题解决方案
- MySQL远程工具链接报错—1130
- C语言试题二之计算并输出下列多项式值s=1+1/(1+2)+1/(1+2+3)+..1/(1+2+3…+50)
- flash调用摄像头弹出设置框监听
- 单片机的单个IO口可以发送数据吗_关于51单片机各个引脚它的功能你了解多少?...
- 20温控f1什么意思_欧姆龙温控器是什么 欧姆龙温控器介绍【图文】
- PyTorch入门-简单图片分类
- Ajax异步与JavaScript的一些初浅认识
- C语言中总是从main函数开始执行函数吗?
- 列出搜索过的数据(类似京东顶部搜索框)
- Spring IOC p名称空间的使用-了解
- 第2章_Java基本语法(下):程序流程控制
- python逻辑判断_return逻辑判断表达式
- 【UVA10256】The Great Divide(凸包相离判定)
- 软件各项会议评审意见模版
- 挑战杯创业计划书_基于云计算的下料优化软件_1. 执行总结
- PLSQL Developer使用
- Padavan(华硕固件) 伪固定闪讯密码.
- 各种坐标系下的散度、梯度、旋度公式
- 惠普服务器电脑装系统教程,惠普台式电脑装系统步骤
热门文章
- 7-二进制,十进制,十六进制
- 体育测试数据绘图软件,原创健身运动体育测试数据统计app界面
- wpf 控件生成图片_EyeshotCAD控件生成以及作用
- mac怎么合并两个容器_Mac怎么合并文件夹?macz不容错过的苹果mac教程分享
- Keras中LSTM的return_sequences和return_state
- CSDN之人人code,整数取反
- 深度学习中的信息论——交叉熵
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 26丨广告效果【难度简单】​
- 一篇文章搞懂数据仓库:常用ETL工具、方法
- SpringBoot 自带工具类~CollectionUtils