Python中的Pathlib可以完美替代os.path

相信现在依然有很多人习惯于使用os来处理文件/文件夹/路径等,但其实Python自带的Pathlib库处理这些更优雅、更安全,你会发现很多大型开源项目都在使用它

先看这个引例,假设我们需要获取某个文件夹下所有的txt文件,基于os会写成如下形式

import osdir_path = "/home/user/documents"# Find all text files inside a directory
files = [os.path.join(dir_path, f) 
for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f)) and f.endswith(".txt")]

使用Pathlib则变成如下形式,是不是心动了

from pathlib import Pathdir_path = Path("/home/user/documents")
files = list(dir_path.glob("*.txt"))

os.path 的最大缺点是将系统路径视为字符串,极容易导致混乱,PathlibPython3.4中被支持, 通过将路径表示为独特的对象解决了这个问题,并为路径处理引入更多可扩展用法,许多操作在os需要层层嵌套,而Pathlib将使开发人员更轻松地处理与路径和文件相关的所有事情

处理路径

1. 创建路径

几乎所有pathlib 的功能都可以通过其 Path 子类访问,可以使用该类创建文件和目录

  • 有多种初始化Path的方式,比如,使用当前工作路径
from pathlib import PathPath.cwd() # PosixPath('/home/user/Downloads')
  • 使用home
Path.home() # PosixPath('/home/user')
  • 同样的可以指定字符串路径创建路径
p = Path("documents") # PosixPath('documents')
  • 使用正斜杠运算符进行路径连接
data_dir = Path(".") / "data"
csv_file = data_dir / "file.csv"
print(data_dir) # data
print(csv_file) # data/file.csv
  • 检查路径是否存在,可以使用布尔函数 exists
data_dir.exists()
  • 检查文件是否存在
csv_file.exists()
  • 使用 is_dir 或 is_file 函数来检查是否为文件夹、文件
data_dir.is_dir()csv_file.is_file()
  • 大多数路径都与当前运行目录相关,但某些情况下必须提供文件或目录的绝对路径,可以使用 absolute
csv_file.absolute() # PosixPath('/home/user/Downloads/data/file.csv')
  • 如果仍然需要将路径转为字符串,可以调用 str(path) 强制转换
str(Path.home()) # '/home/user'

现如今大多数库都支持 Path 对象,包括 sklearn 、 pandas 、 matplotlib 、 seaborn 等

2. Path属性

Path 对象有许多有用属性,一起来看看这些示例,首先定义一个图片路径

image_file = Path("images/shadousheng.png").absolute() # PosixPath('/home/user/Downloads/images/midjourney.png')

先从 parent 开始,它将返回当前工作目录的上一级

image_file.parent # PosixPath('/home/user/Downloads/images')

获取文件名

image_file.name # 'shadousheng.png'

它将返回带有后缀的文件名,若只想要前缀,则使用stem

image_file.stem # shadousheng

只想要后缀也很简单

image_file.suffix # '.png'

如果要将路径分成多个部分,可以使用 parts

image_file.parts # ('/', 'home', 'user', 'Downloads', 'images', 'shadousheng.png')

如果希望这些组件本身就是 Path 对象,可以使用 parents 属性,它会创建一个生成器

for i in image_file.parents:print(i)# /home/user/Downloads/images
# /home/user/Downloads
# /home/user
# /home
# /

处理文件

想要创建文件并写入内容,不必再使用 open 函数,只需创建一个 Path 对象搭配 write_text 或 write_btyes 即可

markdown = data_dir / "file.md"# Create (override) and write text
markdown.write_text("# This is a test markdown")

读取文件,则可以 read_text 或 read_bytes

markdown.read_text() # '# This is a test markdown'
len(image_file.read_bytes()) # 1962148

但请注意, write_text 或 write_bytes 会覆盖文件的现有内容

# Write new text to existing file
markdown.write_text("## This is a new line")
# The file is overridden
markdown.read_text() # '## This is a new line'

要将新信息附加到现有文件,应该在 a (附加)模式下使用 Path 对象的 open 方法:

# Append text
with markdown.open(mode="a") as file:file.write("\n### This is the second line")markdown.read_text() # '## This is a new line\n### This is the second line'

使用rename 重命名文件,比如在当前目录中重命名,如下file.md 变成了 new_markdown.md

renamed_md = markdown.with_stem("new_markdown")markdown.rename(renamed_md) # PosixPath('data/new_markdown.md')

通过 stat().st_size 查看文件大小

# Display file size
renamed_md.stat().st_size # 49

查看最后一次修改文件的时间

from datetime import datetimemodified_timestamp = renamed_md.stat().st_mtimedatetime.fromtimestamp(modified_timestamp) # datetime.datetime(2023, 8, 1, 13, 32, 45, 542693)

st_mtime 返回一个自 1970 年 1 月 1 日以来的秒数。为了使其可读,搭配使用 datatimefromtimestamp 函数。

要删除不需要的文件,可以 unlink

renamed_md.unlink(missing_ok=True)

如果文件不存在,将 missing_ok 设置为 True 则不会引起报错

处理目录

首先,看看如何递归创建目录

new_dir.mkdir(parents=True, exist_ok=True)

默认情况下, mkdir 创建给定路径的最后一个子目录,如果中间父级不存在,则必须将 parents 设置为 True 达到递归创建目的

要删除目录,可以使用 rmdir ,如果给定的路径对象是嵌套的,则仅删除最后一个子目录

new_dir.rmdir()

要在终端上列出 ls 等目录的内容,可以使用 iterdir 。结果将是一个生成器对象,一次生成一个子内容作为单独的路径对象,和os.listdir不同的是,它返回每个内容的绝对路径而不是名字

for p in Path.home().iterdir():print(p)
# /home/user/anaconda3
# /home/user/.googleearth
# /home/user/.zcompdump
# /home/user/.ipython
# /home/user/.bashrc

要捕获具有特定扩展名或名称的所有文件,可以将 glob 函数与正则表达式结合使用。

例如,使用 glob(“*.txt”) 查找主目录中所有文本文件

home = Path.home()
text_files = list(home.glob("*.txt"))len(text_files) # 3

要递归搜索文本文件(即在所有子目录中),可以glob 与 rglob 结合使用:

all_text_files = [p for p in home.rglob("*.txt")]len(all_text_files) # 5116

以上就是Pathlib中常用方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt openai API报错openai.error.APIConnectionError

openai.error.APIConnectionError: Error communicating with OpenAI: 报错信息无用方案问题查看urllib3版本方法 可行方案法1法2:自己找包安装 报错信息 raise error.APIConnectionError( openai.error.APIConnectionError: Error communicating with OpenAI: HTT…

Linux ARM64架构 动态替换 altinstructions

文章目录 简介一、altinstructions节1.1 .altinstructions1.2 .rela.altinstructions 二、内核模块重定位源码分析参考资料 简介 在内核开发中,有时需要对内核代码进行修补,以解决bug、优化性能或引入新功能。替代指令(altinstructions&…

Connection reset原因分析及解决思路

Connection reset原因分析及解决思路 我们在开发过程中经常会出现Connection reset问题,包括http调用,数据库连接等场景。出现Connection reset的原因很多,本文从tcp层面简单介绍下Connection reset出现的原因和问题,以及在实际开…

宏观上看Spring创建对象的过程

宏观上看Spring创建对象的过程 对于对象而言,可以分为简单对象和复杂对象; 简单对象 简单对象指可以直接new的对象; Spring在创建这些对象时,是基于反射来完成的。复杂对象 复杂对象指不能直接new的对象。 比如:要得到…

运行 Jmeter 文件生成 HTML 测试报告,我选择 ANT 工具

概述 ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。 在与 Jmeter 生成的 jmx 文件配合使用中,ant 会完成jmx计划的执行和生成jtl文件,并将jtl文件转化为html页面进行查看。 还可…

Django架构图

1. Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身…

【车道线】TwinLiteNet 复现过程全纪录

码字不易,喜欢的请点赞收藏!!!!! 论文全文翻译:【freespace】TwinLiteNet: An Efficient and Lightweight Model for Driveable Area and Lane Segmentation_莫克_Cheney的博客-CSDN博客 目录…

安装Jenkins

一、什么是Jenkins Jenkins是一个开源软件项目,是基于Java开发的。我们可以利用Jenkins来实现持续集成的功能。 因为Jenkins是基于Java开发的,所以在安装Jenkins之前首先需要安装Java的JDK。 二、安装Jenkins 在Windows平台上面安装Jenkins共有两种方式…

Python爬虫——解析_jsonpath

jsonpath的安装 pip install jsonpathjsonpath的使用: obj json.load(open(json文件, r, encodingutf-8)) ret jsonpath.jsonpath(obj, jsonpath语法)json文件: { "store": {"book": [{ "category": "末世"…

pgsql查询某表所有字段

查询某表所有字段 查询某表所有字段 select * from information_schema.columns where table_schema模式名称 and table_name表名;模式 查询某表字段个数 select count(*) from information_schema.columns where table_schema模式名称 and table_name表名;

RISC-V基础之浮点指令(包含实例)

RISC-V体系结构定义了可选的浮点扩展,分别称为RVF、RVD和RVQ,用于操作单精度、双精度和四倍精度的浮点数。RVF/D/Q定义了32个浮点寄存器,f0到f31,它们的宽度分别为32位、64位或128位。当一个处理器实现了多个浮点扩展时&#xff0…

逻辑卷扩容

背景 服务器有3个逻辑卷,1个是1T,另外两个是500G,需要将500G的合并扩容为1T 操作 df -Th lsblk -f 查看磁盘大小卸载 /approot umount /approot vim /etc/fstab #注释掉/approot mount -a检查是否卸载完成 vgdisplay -v 找到approot所在…

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…

Spring Boot多级缓存实现方案

1.背景 缓存,就是让数据更接近使用者,让访问速度加快,从而提升系统性能。工作机制大概是先从缓存中加载数据,如果没有,再从慢速设备(eg:数据库)中加载数据并同步到缓存中。 所谓多级缓存,是指在整个系统架…

Kotlin重点理解安全性

目录 一 Kotlin安全性1.1 可空类型1.2 安全调用运算符1.3 Elvis 运算符1.4 非空断言运算符1.5 安全类型转换1.6 延迟初始化 一 Kotlin安全性 Kotlin 在设计时采用了一系列策略,旨在尽可能地减少空指针异常(NullPointerException)的出现。空指…

通用视觉大模型

ViT: Google Swin-Transformer: Microsoft V-MOE: Google SAM: Meta 盘古CV: 华为 文心UFO: 百度 … 预训练大模型 # 导入必要的库和模块 import argparse import json import pathlib# 定义 Stanford Alpaca 使用的 prompt 格式 PROMPT_D…

纯函数 和 函数柯里化 05 (待补充)

加油,今天周二啦!😍 文章目录 前言一、js 的纯函数二、副作用三、纯函数的优势四、JavaScript 柯里化五、柯里化作用 - 让函数的职责单一六、柯里化作用 - 逻辑的复用七、自动柯里化函数(我没理解,等我理解了再更&…

如何在洛谷自己出的题中出数据

首先,假如你要加1个数据: 打开Dev-c(其他也行) 填入输入数据: (这个数据只是我编的) 将这个东东保存为in文件(第一个数据就名为001,第二个002)&#xff1a…

2022 robocom 世界机器人开发者大赛-本科组(国赛)

RC-u1 智能红绿灯 题目描述: RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的: 路的两旁设置了一个按钮,老年人希望通行马路时会…

没有进度管理的项目,都是在做无用功

在项目管理过程中,最大的挑战之一是确保项目实施与计划保持一致。 项目实施过程是一个相对漫长的过程,其中受到许多因素的影响。如果项目实施没有按照原始项目计划进行,很容易导致项目偏离计划,最终可能导致项目停滞或失败。 当…