首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找两条路径之间的差异

寻找两条路径之间的差异
EN

Stack Overflow用户
提问于 2021-08-20 11:06:12
回答 1查看 499关注 0票数 1

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

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

我的问题是,如何使用用户提供的2条路径找到XML项目文件的相对路径,以替换该路径的所有外观?

我尝试过使用relative_to函数,但是由于项目文件不是父目录,所以会出现错误。

代码语言:javascript
复制
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'

我目前的项目布局

代码语言:javascript
复制
.
├── _libs
│   ├── src
│   └── inc
└── MDK_arm
    └── projectFile   

设计的项目布局

代码语言:javascript
复制
.
├── _libs
|   └── Application
│        ├── src
│        └── inc
├── MDK_arm
    └── projectFile   

我正在运行的修复项目文件的代码

代码语言:javascript
复制
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='')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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给出误差

代码语言:javascript
复制
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))

结果:(与你问题中的错误类似)

代码语言:javascript
复制
ValueError: 'SI/SI_Boot/SiBoot' does not start with 'SI/SI_Boot/MDK-ARM/SI_Boot.uvprojx'

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

代码语言:javascript
复制
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))

结果:

代码语言:javascript
复制
../../SiBoot
../MDK-ARM/SI_Boot.uvprojx
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68861207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档