Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the relative path between two absolute paths in Python using pathlib?

In Python 3, I defined two paths using pathlib, say:

from pathlib import Path

origin = Path('middle-earth/gondor/minas-tirith/castle').resolve()
destination = Path('middle-earth/gondor/osgiliath/tower').resolve()

How can I get the relative path that leads from origin to destination? In this example, I'd like a function that returns ../../osgiliath/tower or something equivalent.

Ideally, I'd have a function relative_path that always satisfies

origin.joinpath(
    relative_path(origin, destination)
).resolve() == destination.resolve()

(well, ideally there would be an operator - such that destination == origin / (destination - origin) would always be true)

Note that Path.relative_to is not sufficient in this case, since origin is not a destination's parent. Also, I'm not working with symlinks, so it's safe to assume that there are none if this simplifies the problem.

How can relative_path be implemented?

like image 852
ruancomelli Avatar asked Nov 13 '19 14:11

ruancomelli


People also ask

How do you find the relative path of an absolute path in Python?

path. relpath() method in Python is used to get a relative filepath to the given path either from the current working directory or from the given directory. Note: This method only computes the relative path.

What does Pathlib path do in Python?

The pathlib is a Python module which provides an object API for working with files and directories. The pathlib is a standard module. Path is the core object to work with files.

How do I find the relative path between two directories?

Just use the relpath() function of the os module. Return a relative filepath to path either from the current directory or from an optional start directory. This is a path computation: the filesystem is not accessed to confirm the existence or nature of path or start.

How do you use relative path in Python?

A relative path starts with / , ./ or ../ . To get a relative path in Python you first have to find the location of the working directory where the script or module is stored. Then from that location, you get the relative path to the file want.


Video Answer


2 Answers

This is trivially os.path.relpath

import os.path
from pathlib import Path

origin      = Path('middle-earth/gondor/minas-tirith/castle').resolve()
destination = Path('middle-earth/gondor/osgiliath/tower').resolve()

assert os.path.relpath(destination, start=origin) == '..\\..\\osgiliath\\tower'
like image 156
Adam Smith Avatar answered Oct 04 '22 23:10

Adam Smith


If you'd like your own Python function to convert an absolute path to a relative path:

def absolute_file_path_to_relative(start_file_path, destination_file_path):
    return (start_file_path.count("/") + start_file_path.count("\\") + 1) * (".." + ((start_file_path.find("/") > -1) and "/" or "\\")) + destination_file_path

This assumes that:

1) start_file_path starts with the same root folder as destination_file_path.

2) Types of slashes don't occur interchangably.

3) You're not using a filesystem that permits slashes in the file name.

Those assumptions may be an advantage or disadvantage, depending on your use case.

Disadvantages: if you're using pathlib, you'll break that module's API flow in your code by mixing in this function; limited use cases; inputs have to be sterile for the filesystem you're working with.

Advantages: runs 202x faster than @AdamSmith's answer (tested on Windows 7, 32-bit)

like image 34
Arundel Avatar answered Oct 04 '22 23:10

Arundel