将具有共同文件夹的两个路径合并

3
在Python中,是否有一种方法可以使用os.path或任何其他库组合两个路径,而不会重复公共子文件夹?例如:
root = '/home/user/test'

rel_path = 'test/files/file.txt'

os.combine(root, rel_path)

返回/home/user/test/files/file.txt而不是/home/user/test/test/files/file.txt


2
我怀疑这是不可能的,因为test文件夹里面也可能有一个test文件夹。 - Ma0
是的,我在想是否有任何内置或库可以使用。 - lapinkoira
3个回答

4
我认为你需要手动完成,我不认为os.path实现了这个功能。
也许可以尝试类似以下的方法:
def combine_with_duplicate(root, rel_path):
    rs = root.split("/")
    rps = rel_path.split("/")
    popped = False
    for v in rs:
        if v == rps[0]:
            rps.pop(0)
            popped = True
        elif popped:
            break

    return "/".join(rs+rps)


print(combine_with_duplicate('/home/user/test', 'test/files/file.txt'))
# /home/user/test/files/file.txt
print(combine_with_duplicate('/home/user', 'test/files/file.txt'))
# /home/user/test/files/file.txt
print(combine_with_duplicate('/home/user/test', 'user/test/files/file.txt'))
# /home/user/test/files/file.txt

0
你可以使用 os.path.join:
import os

root = '/home/user/test'

rel_path = 'test/files/file.txt'

head, tail = os.path.split(root)
final = os.path.join(head, rel_path)

print(final)
#  /home/user/test/files/file.txt 

如果 root = '/home/user/test/files',你必须进行递归。 - Ma0
很不幸,这只有在根的最后一部分与相对路径的第一部分匹配时才能起作用。要递归地执行此操作,您必须编写自定义代码。而递归将带来它自己的问题集。 - Neill Herbst
我知道,这就是为什么我在“询问”的原因。而且 OP 没有将重叠的大小限制为一个共同的文件夹。 - Ma0
@Ev.Kounis,收到你的反馈后,请审核我的回答 :) - akash karothiya

0

你可以尝试:

>>> import os
>>> root = '/home/user/test'
>>> rel_path = 'test/files/file.txt'
>>> os.path.join(root, '../', rel_path)
'/home/user/test/../test/files/file.txt'

或者在根路径和相对路径之间没有“重叠”部分的情况下:

>>> os.path.join(root, '../' if root.split('/')[-1] == rel_path.split('/')[0] else '' , rel_path)
'/home/user/test/../test/files/file.txt'
>>> root =  '/home/user/test/files'
>>> os.path.join(root, '../' if root.split('/')[-1] == rel_path.split('/')[0] else '' , rel_path)
'/home/user/test/files/test/files/file.txt'

如果 root = '/home/user/test/files',你必须进行递归。 - Ma0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接