当前位置: 首页 > news >正文

使用 Path 对象来定义路径

1.relative_to 方法用于获取一个路径相对于另一个路径的相对路径。下面是一个详细的示例,帮助你更好地理解 relative_to 的用法。

示例

假设我们有以下路径结构:

base_dir/
    subdir1/
        file1.txt
    subdir2/
        file2.txt

代码示例

from pathlib import Path

# 定义基础路径
base_dir = Path('/path/to/base_dir')

# 定义子路径
file1_path = Path('/path/to/base_dir/subdir1/file1.txt')
file2_path = Path('/path/to/base_dir/subdir2/file2.txt')

# 获取相对路径
relative_file1_path = file1_path.relative_to(base_dir)
relative_file2_path = file2_path.relative_to(base_dir)

print(f"Relative path of file1: {relative_file1_path}")
print(f"Relative path of file2: {relative_file2_path}")

输出

Relative path of file1: subdir1/file1.txt
Relative path of file2: subdir2/file2.txt

解释

  1. 定义基础路径base_dir 是基础路径。
  2. 定义子路径file1_path 和 file2_path 是具体的文件路径。
  3. 获取相对路径
    • file1_path.relative_to(base_dir) 返回 file1.txt 相对于 base_dir 的相对路径,即 subdir1/file1.txt
    • file2_path.relative_to(base_dir) 返回 file2.txt 相对于 base_dir 的相对路径,即 subdir2/file2.txt

应用

在下面脚本中,relative_to 方法用于获取 .jpg.json 文件相对于 path_all0 的相对路径。然后,你可以使用这个相对路径来构建目标图片的路径。

import os
import glob
from pathlib import Path
from tqdm import tqdm

# 定义路径
path_all0 = Path(r'/pre_label/Sity_20240326_temp/sity_latest/')
img_base_path = Path(r'/train_data/sity/Aty/pre_label/v1/')
out_path = Path(r"/yolo2025\train\train.txt").resolve()

# 获取所有 .jpg.json 文件
path_img_f = list(glob.glob(f"{path_all0}/**/*.jpg.json", recursive=True))

# 写入文件
with open(out_path, "w") as file:
    for j in tqdm(path_img_f, desc="***数据处理进度***"):
        # 使用 os.path 模块处理路径
        relative_path = Path(j).relative_to(path_all0)
        img_path = img_base_path / relative_path.with_suffix('.jpg')
        
        # 检查文件存在性
        if img_path.exists() and Path(j).exists():
            file.write(f"{img_path}\n")
        else:
            print(f"文件不存在: {img_path} 或 {j}")

解释

  1. 定义路径:使用 Path 对象定义基础路径和目标路径。
  2. 获取文件列表:使用 glob 获取所有 .jpg.json 文件。
  3. 路径处理
    • relative_path = Path(j).relative_to(path_all0):获取 j 相对于 path_all0 的相对路径。
    • img_path = img_base_path / relative_path.with_suffix('.jpg'):将 .jpg.json 文件的后缀替换为 .jpg,并拼接成目标图片路径。
  4. 文件存在性检查:在写入文件之前,确保目标文件和对应的图片文件都存在。如果文件不存在,打印一条调试信息。

2.with_suffix 方法是 Path 对象的一个方法,用于更改路径的文件扩展名。下面是一个详细的示例,帮助你更好地理解 with_suffix 的用法。

示例

假设我们有以下路径:

/path/to/file1.txt

我们想将这个路径的扩展名从 .txt 改为 .jpg

代码示例

from pathlib import Path

# 定义路径
file_path = Path('/path/to/file1.txt')

# 更改文件扩展名
new_file_path = file_path.with_suffix('.jpg')

print(f"Original path: {file_path}")
print(f"New path: {new_file_path}")

输出

Original path: /path/to/file1.txt
New path: /path/to/file1.jpg

解释

  1. 定义路径file_path 是原始路径。
  2. 更改文件扩展名
    • file_path.with_suffix('.jpg') 返回一个新的 Path 对象,其文件扩展名被更改为 .jpg
  3. 输出路径:打印原始路径和新路径。

应用

在如下脚本中,with_suffix 方法用于将 .jpg.json 文件的扩展名更改为 .jpg。然后,你可以使用这个新的路径来构建目标图片的路径。

优化后的脚本

import os
import glob
from pathlib import Path
from tqdm import tqdm

# 定义路径
path_all0 = Path(r'/pre_label/Sity_20240326_temp/sity_latest/')
img_base_path = Path(r'/train_data/sity/Aty/pre_label/v1/')
out_path = Path(r"/yolo_2025\train\train.txt").resolve()

# 获取所有 .jpg.json 文件
path_img_f = list(glob.glob(f"{path_all0}/**/*.jpg.json", recursive=True))

# 写入文件
with open(out_path, "w") as file:
    for j in tqdm(path_img_f, desc="***数据处理进度***"):
        # 使用 os.path 模块处理路径
        relative_path = Path(j).relative_to(path_all0)
        img_path = img_base_path / relative_path.with_suffix('.jpg')
        
        # 检查文件存在性
        if img_path.exists() and Path(j).exists():
            file.write(f"{img_path}\n")
        else:
            print(f"文件不存在: {img_path} 或 {j}")

解释

  1. 定义路径:使用 Path 对象定义基础路径和目标路径。
  2. 获取文件列表:使用 glob 获取所有 .jpg.json 文件。
  3. 路径处理
    • relative_path = Path(j).relative_to(path_all0):获取 j 相对于 path_all0 的相对路径。
    • img_path = img_base_path / relative_path.with_suffix('.jpg'):将 .jpg.json 文件的后缀替换为 .jpg,并拼接成目标图片路径。
  4. 文件存在性检查:在写入文件之前,确保目标文件和对应的图片文件都存在。如果文件不存在,打印一条调试信息。

相关文章:

  • 在Vue3中使用Echarts的示例
  • 用户行为路径分析(Google Analytics数据挖掘)
  • Linux系统移植篇(十一)Linux 内核启动流程
  • 通过Continue调用Deepseek API keys,搭建AI代码助手
  • MySQL程序
  • WPF CommunityToolkit.MVVM库的简单使用
  • vue3之写一个aichat ----vite.config.js
  • 路由器安全研究|D- Link DIR-823G v1.02 B05 复现与利用思路
  • 从零搭建 Vue 3 + Element Plus 项目实战指南
  • WPF跨平台开发探讨:借助相关技术实现多平台应用
  • mysql学习-常用sql语句
  • 解决SpringCloud整合Nacos启动报java.lang.IllegalArgumentException: illegal dataId
  • 设计C语言的单片机接口
  • Springdoc 全部注解一文解释清楚
  • Python的Pytest测试框架(1)
  • 实验一:统计字符个数
  • 【QT】-toUtf8() 和 toBase64()的区别
  • mysql5.7主从部署(docker-compose版本)
  • 【责任链模式的多种实现方式及其应用】
  • Modbus协议
  • 马上评丨机械停车库成“僵尸库”,设计不能闭门造车
  • 幸福航空取消“五一”前航班,财务人员透露“没钱飞了”
  • 一张老照片里蕴含的上海文脉
  • 洛阳原副市长收礼品消费卡,河南通报6起违反八项规定典型问题
  • 持续更新丨伊朗官员:港口爆炸事件已致5人死亡
  • 泽连斯基公布与特朗普会晤细节,强调实现全面、无条件停火