移除路径前缀回退点:合并两个文件路径的技术问题
如何合并两个路径并移除相对路径中的回退点(..)
我有两个路径:
path1 = "/users/fida/data_lake/data/archived/09142023" path2 = "/users/fida/data_lake/data/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp"
期望合并后的输出路径为:
/users/fida/data_lake/data/archived/09142023/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp
尝试用os.path.relpath方法时,得到带回退点的路径:
..\..\localpublished\SPTTES\End_to_End_Edit_Schedule\2022-08-03_11_22_03.kp
需要解决的是移除这些回退点,得到正确的合并路径。
核心思路
之前调用os.path.relpath(path2, path1)得到带..的路径,是因为这个方法计算的是从path1到path2的相对路径——path2不在path1的子目录下,所以需要回退两级到共同父目录/users/fida/data_lake/data/,再进入path2的目录结构。
正确的做法是:先提取path2中相对于共同父目录的子路径,再把这部分拼接到path1后面。
方法一:用pathlib(推荐,Python 3.4+)
pathlib是Python 3.4+引入的面向对象路径处理模块,代码更简洁直观:
from pathlib import Path path1 = Path("/users/fida/data_lake/data/archived/09142023") path2 = Path("/users/fida/data_lake/data/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp") # 共同父目录是path1的上级目录 common_parent = path1.parent # 获取path2相对于共同父目录的相对路径(无回退点) relative_part = path2.relative_to(common_parent) # 拼接得到最终路径 merged_path = path1 / relative_part print(merged_path) # 输出:/users/fida/data_lake/data/archived/09142023/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp
方法二:用os.path模块
如果需要兼容Python 2或者习惯传统模块,也可以用os.path实现:
import os path1 = "/users/fida/data_lake/data/archived/09142023" path2 = "/users/fida/data_lake/data/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp" # 获取共同父目录(path1的上级目录) common_parent = os.path.dirname(path1) # 计算path2相对于共同父目录的相对路径 relative_part = os.path.relpath(path2, common_parent) # 拼接路径 merged_path = os.path.join(path1, relative_part) print(merged_path) # 输出:/users/fida/data_lake/data/archived/09142023/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp
通用兼容方案(自动识别共同路径)
如果路径结构更复杂(比如共同父目录不是path1的直接上级),可以用os.path.commonpath自动找到两个路径的最长共同路径,再提取path2中超出的部分:
import os path1 = "/users/fida/data_lake/data/archived/09142023" path2 = "/users/fida/data_lake/data/localpublished/SPTTES/End_to_End_Edit_Schedule/2022-08-03_11_22_03.kp" # 自动获取最长共同路径 common_path = os.path.commonpath([path1, path2]) # 提取path2相对于共同路径的部分 relative_part = os.path.relpath(path2, common_path) # 拼接 merged_path = os.path.join(path1, relative_part) print(merged_path)
内容的提问来源于stack exchange,提问作者Hayat
相关产品推荐
相关产品推荐

