找到两条路径之间的差异
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
我正在编写一个脚本,允许我移动文件夹并修复基于 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