Python中使用pathlib进行文件系统操作

pathlib 是 Python 的一个标准库,它提供了一个面向对象的文件系统路径操作接口。使用 pathlib,你可以以一种更直观和更易于理解的方式处理文件路径,而不必使用字符串操作来分割和连接路径。

os模块 vs pathlib

在Python 3.4之前,处理文件路径的更传统的方法是使用os模块。

我们可以通过考虑数据科学中的一个常见任务来展示pathlib的独特价值:如何找到给定目录及其所有子目录中的所有png文件。

如果我们使用的是os模块,我们可能会编写以下代码:

import os
dir_path = "/home/user/documents"
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(".png")
]

虽然这段代码解决了查找png文件的即时任务,但它揭示了os模块的几个主要缺点。首先,代码很长,几乎不可读,这是一个遗憾,考虑到这是一个相对简单的操作。第二点,我们的代码假设了列表解析的知识,这不应该被认为是理所当然的。第三点,代码涉及字符串操作,这是容易出错的。最重要的是,代码不是很简洁。

相反,如果我们使用pathlib模块,我们的代码会简单得多。正如我们所提到的,pathlib提供了一种面向对象的方法来处理文件系统路径。

from pathlib import Path# Create a path object
dir_path = Path(dir_path)# Find all text files inside a directory
files = list(dir_path.glob("*.png"))

这种面向对象的编程围绕对象及其交互来组织代码,从而产生更多的模块化、可重用和可维护的代码。

在Python中使用Path对象

pathlib库围绕所谓的Path对象展开,paths对象是一种以结构化和 平台独立的方式。

我们使用以下代码行将Path类从pathlib模块引入到当前的命名空间中:

from pathlib import Path

从pathlib调用Path类后,我们可以通过多种方式创建Path对象,包括从字符串、从其他Path对象、从当前工作目录和从主目录。

从字符串创建路径对象

我们可以通过将表示文件系统路径的字符串传递给变量来创建Path对象。这将文件路径的字符串表示形式转换为Path对象。

file_path_str = "data/union_data.csv"data_path = Path(file_path_str)

从其他路径对象创建

现有的Path对象可以用作创建新路径的构建块。

我们通过将基本路径、数据目录和文件名组合成一个文件路径来实现这一点。我们必须记住在适当的地方使用正斜杠来扩展Path对象。

base_path = Path("/home/user")
data_dir = Path("data")# Combining multiple paths
file_path = base_path / data_dir / "prices.csv"  
print(file_path)

输出

'/home/user/data/prices.csv'

从当前工作目录创建路径对象

这里我们使用Path.cwd()方法将当前工作目录分配给cwd变量。然后,我们可以检索脚本运行的当前工作目录的路径。

cwd = Path.cwd()print(cwd)

输出

'/home/bexgboost/articles/2024/4_april/8_pathlib'

从主工作目录创建路径对象

我们可以通过将主目录与其他子目录组合来构造路径。在这里,我们将主目录与子目录“downloads”和“projects”合并。"

home = Path.home()home / "downloads" / "projects"

重要提示:Path类本身不执行任何文件系统操作,如路径验证、创建目录或文件。它被设计用于表示和操作路径。要与文件系统进行实际交互(检查是否存在,阅读/写入文件),我们必须使用Path对象的特殊方法,对于某些高级情况,请从os模块获得帮助。

在Python中使用Path组件

文件路径属性是文件路径的各种属性和组件,有助于识别和管理文件系统中的文件和目录。就像物理地址有不同的部分,如街道号码,城市,国家和邮政编码,文件系统路径可以分解为更小的组件。pathlib允许我们通过点表示法使用路径属性访问和操作这些组件。

使用根目录

根目录是文件系统中最顶层的目录。在类Unix系统中,它由正斜杠(/)表示。在Windows中,它通常是一个驱动器号后跟一个冒号,如C:。

image_file = home / "downloads" / "midjourney.png"image_file.root

输出

'/'

使用父目录

父级包含当前文件或目录。它相对于当前目录或文件高一级。

image_file.parent

输出

PosixPath('/home/bexgboost/downloads')

使用文件名

此属性以字符串形式返回整个文件名,包括扩展名。

image_file.name

输出

'midjourney.png'

使用文件后缀

suffix属性以字符串形式返回文件扩展名,包括点(如果没有扩展名,则返回空字符串)。

image_file.suffix

输出

'.png'

注意:在Mac上,文件路径区分大小写,因此/Users/username/Documents和/users/username/documents会有所不同。

.parts属性

我们可以使用.parts属性将Path对象拆分为它的组件。

image_file.parts

输出

('/', 'home', 'bexgboost', 'downloads', 'midjourney.png')

使用pathlib的常见路径操作

以下是一些使用 pathlib 进行常见路径操作的示例:

  1. 创建路径对象:

    from pathlib import Pathp = Path("/usr/bin")
    
  2. 路径拼接:

    new_path = p / "local" / "script.py"
    
  3. 获取文件扩展名:

    extension = new_path.suffix
    
  4. 更改文件扩展名:

    new_extension = new_path.with_suffix(".txt")
    
  5. 检查路径是否存在:

    exists = new_path.exists()
    
  6. 检查路径是否为文件:

    is_file = new_path.is_file()
    
  7. 检查路径是否为目录:

    is_dir = new_path.is_dir()
    
  8. 读取文件内容:

    with new_path.open('r') as file:content = file.read()
    
  9. 写入文件内容:

    with new_path.open('w') as file:file.write("Hello, world!")
    
  10. 删除文件:

    new_path.unlink()
    
  11. 创建目录:

    new_path.mkdir(parents=True, exist_ok=True)
    
  12. 删除目录:

    new_path.rmdir()
    
  13. 获取目录中的文件和子目录:

    items = list(new_path.iterdir())
    
  14. 绝对路径:

    absolute_path = new_path.absolute()
    
  15. 相对路径:

    relative_path = new_path.relative_to("/usr")
    
  16. 路径解析:

    parts = new_path.parts
    drive, root, parts = new_path.drive, new_path.root, new_path.parts
    
  17. 路径字符串转换:

    path_str = str(new_path)
    
  18. 遍历目录树:

    for child in new_path.rglob('*.py'):print(child)
    

这些是 pathlib 模块提供的一些基本操作。pathlib 模块使得文件系统路径的操作更加直观和易于管理。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

得物App入选诚信案例,10万正品样品库夯实高品质消费

近日,以“加强企业诚信建设 赋能经济社会发展”为主题的“2024年全国企业诚信建设大会”在烟台市召开。此次大会由中国企业联合会、中国企业家协会主办,山东省企业联合会、山东省企业家协会、烟台市企业联合会、烟台大学承办。大会期间,得物A…

036 RabbitMQ消息确认 死信队列 延时队列

文章目录 生产者确认模式application.propertiesMessageController.javaMessageConfirmRallback.java 生产者回退模式application.propertiesMessageConfirmRallback.javaMessageController.java 消费者手动确认application.propertiesConsumerAckQueueListener.java 死信队列延…

docker desktop运行rabittmq容器,控制台无法访问

docker desktop运行rabittmq容器,控制台无法访问 启动过程:…此处缺略,网上一大堆 原因 原因是在Docker上运行的RabbitMQ,默认情况下是没有启用管理插件和管理页面的 解决办法 使用命令 docker exec -it 容器id /bin/bash 进…

Tailwind 安装使用

Tailwind 安装使用 前言 CSS原子化——本文将详细介绍如何在Vue Vite npm环境下安装、配置并使用Tailwind CSS! 文章目录 Tailwind 安装使用前言一、Tailwind 在 Vue Vite 项目中的安装1. 创建Vue项目2. 安装Tailwind CSS3. 初始化Tailwind配置4. 修改文件 tai…

centos7安装playwright踩坑记录

Python版本安装 Installation | Playwright Python 1. 安装pytest-playwright pip3 install pytest-playwright报错:提示找不到pytest-playwright 原因:服务器Python版本3.6.8太低,貌似pytest-playwright最低支持3.7 解决方法&#xff1…

函数(C语言)

1:函数的概念 函数的概念我们在初中的时候就已经听过了。 在C语言中也引入了函数,也可以叫子程序 C语言中的函数就是一个完成某项特定的任务的一小段代码 这段代码是有特殊的写法和调用方法的。其实C语言的程序也是由无数个小的函数组成的。 也就是&…

VMWare安装包及安装过程

虚拟机基本使用 检查自己是否开启虚拟化 如果虚拟化没有开启,需要自行开启:百度加上自己电脑的品牌型号,进入BIOS界面开启 什么是虚拟机 所谓的虚拟机,就是在当前计算机系统中,又开启了一个虚拟系统 这个虚拟系统&…

基于SVD奇异值分解的图像压缩算法(Python实现)

前言 SVD其实和PCA类似,就是丢入一个特征矩阵 X ,输出另外一个特征矩阵 X′ , X′ 的维度要比原来的X 要低。并且里面的变量都是原来的变量的线性组合,所以含义也变得不好解释。 简单来说就是数据压缩,特征降维的一种技术&#…

国产AI图片工具,全部免费亲测实用!

近AI生图功能火出圈了,各家大厂都拿出了看家本领,今天就来聊聊即梦AI、通义万相、奇域AI和腾讯元宝的AI生图功能,看看它们各有什么特色吧! 一、Dreamina 字节旗下的AI智能平台,简单实用的图片生成,对中国元…

C++ 二叉搜索树

二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右…

推荐一款3D建模软件:Agisoft Metashape Pro

Agisoft Metashape Pro是一款强大的多视点三维建模设计辅助软件,Agisoft Metashape是一款独立的软件产品,可对数字图像进行摄影测量处理,并生成3D空间数据,用于GIS应用,文化遗产文档和视觉效果制作,以及间接…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplat…

Linux高阶——1110—线程安全问题解决方法

1、同步、异步、阻塞、非阻塞 同步过程:发起调用,调用者需要等待被调用者的结果 异步过程:发起调用,无需等待被调用的结果,当有结果后,此结果传出,无需主动获取 阻塞和非阻塞:发起…

STM32cubemx+Proteus仿真和keil5联合调试

前面两步 STM32cubemx生成代码 https://blog.csdn.net/weixin_52733843/article/details/143637304 Proteus新建工程 https://blog.csdn.net/weixin_52733843/article/details/143578853 1 *Proteus仿真联合调试* 在Proteus中,双击STM32F103C6芯片&#xff0c…

初识算法 · 位运算常见总结(1)

目录 前言: 位运算基本总结 部分题目代码 前言: ​本文的主题是位运算,通过常见的知识点讲解,并且会附上5道简单的题目,5道题目的链接分别为:191. 位1的个数 - 力扣(LeetCode) 1…

visualvm远程连接Docker容器中部署的java应用并监控

visualvm远程连接Docker容器中部署的java应用 前言 jdk1.8中自带了,java11中需要单独下载 下载地址 visualvm下载地址 简介 java虚拟机监控,故障排查及性能分析工具。 网络配置 局域网与docker内网打通,请参考:办公网络与Docker内…

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM 文章目录 NVIDIA RTX 系统上使用 llama.cpp 加速 LLMllama.cpp 概述llama.cpp 在 NVIDIA RTX 上的加速性能使用 llama.cpp 构建的开发人员生态系统使用 llama.cpp 在 RTX 平台上加速的应用程序开始使用 适用于 Windows PC 的 NVIDIA …

信息收集系列(二):ASN分析及域名收集

内容预览 ≧∀≦ゞ 信息收集系列(二):ASN分析及域名收集前言一、ASN 分析1. 获取 ASN 码2. 使用 ASNMap 获取 IP 范围3. 将 IP 范围转化为 IP 列表 二、关联域名收集1. 顶级域(TLD)收集测试方法 2. 根域名收集常用方法…

揭秘:b站可以通过弹幕查询到发送者吗?答案是:不可行

查找发送者 发弹幕被找到 最近,我的一个好兄弟遇到了这样一个问题:他在b站发弹幕,结果被人找到了。他对此很困惑:“发送弹幕不是匿名的吗?只有评论才能看到用户名啊,难道发弹幕也可以被找到吗&#xff1f…

安装mysql、Navicat 17

1.安装mysql 下载地址 https://downloads.mysql.com/archives/installer/ 选择最新版本或者你需要的版本 点击第二个Download下载 下载完毕后双击启动,之后是这个页面 选Custom(第四个)自定义安装,可以将mysql安装到自定义目录…