找到两条路径之间的差异

Finding the difference between two paths

我正在编写一个脚本,允许我移动文件夹并修复基于 XML 的项目文件。

我从用户那里获取源路径和目标路径并将它们保存在 pathlib.Path 对象中。

我的问题是,如何使用用户给出的 2 个路径找到 XML 项目文件的相对路径,以替换此路径的所有外观?

我试过使用relative_to功能,但是因为项目文件不是父目录,所以报错

Traceback (most recent call last):
  File "KeilMoveFile.py", line 50, in <module>
    fix_keil_project(keilPrjFile, objToCopy)
  File "KeilMoveFile.py", line 29, in fix_keil_project
    print(line.replace(str(SrcDstPath.src.relative_to(prjFilePath)),
  File "C:\Program Files\Python38\lib\pathlib.py", line 884, in relative_to
    raise ValueError("{!r} does not start with {!r}"
ValueError: 'SI\SI_Boot\SiBoot' does not start with 'SI\SI_Boot\MDK-ARM\SI_Boot.uvprojx'

我当前的项目布局

.
├── _libs
│   ├── src
│   └── inc
└── MDK_arm
    └── projectFile   

想要的项目布局

.
├── _libs
|   └── Application
│        ├── src
│        └── inc
├── MDK_arm
    └── projectFile   

我目前的代码运行修复工程文件

def fix_keil_project(prjFilePath, SrcDstPath):
    with fileinput.FileInput(prjFilePath, inplace=True, backup='.bak') as file:
        dstStrToReplace = str(SrcDstPath.dst.relative_to(prjFilePath))
        srcStrToReplace = str(SrcDstPath.src.relative_to(prjFilePath))
        for line in file:
            print(line.replace(srcStrToReplace, dstStrToReplace), end='')

问题是 relative_to() 只搜索子文件夹而不是需要 .. 的文件夹。
您将不得不使用 os.path.relpath() 而不是模块 pathlib.


错误显示两条路径 'SI\SI_Boot\SiBoot''SI\SI_Boot\MDK-ARM\SI_Boot.uvprojx' 所以我在示例中使用它们。因为我使用 Linux 所以我用 / 而不是 \.

进行了测试

pathlib 给出错误

import pathlib

path1 = 'SI/SI_Boot/SiBoot'
path2 = 'SI/SI_Boot/MDK-ARM/SI_Boot.uvprojx'

src = pathlib.Path(path1)
dst = pathlib.Path(path2)

print(src.relative_to(dst))
#print(dst.relative_to(src))

结果:(如您问题中的错误)

ValueError: 'SI/SI_Boot/SiBoot' does not start with 'SI/SI_Boot/MDK-ARM/SI_Boot.uvprojx'

但是os.path.relpath给出了预期的结果

import os

path1 = 'SI/SI_Boot/SiBoot'
path2 = 'SI/SI_Boot/MDK-ARM/SI_Boot.uvprojx'

print(os.path.relpath(path1, path2))
print(os.path.relpath(path2, path1))

结果:

../../SiBoot
../MDK-ARM/SI_Boot.uvprojx