我正在编写一个脚本,它允许我移动一个文件夹并修复一个基于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='')发布于 2021-08-21 11:54:14
问题是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.uvprojxhttps://stackoverflow.com/questions/68861207
复制相似问题