Source code for sas.sascalc.data_util.pathutils

#!/usr/bin/env python
"""
Utilities for path manipulation. Not to be confused with the pathutils module
from the pythonutils package (http://groups.google.com/group/pythonutils).
"""

# NOTE: If enough of _that_ pathutils functionality is required, we can switch
# this module for that one.

# TODO: Make algorithm more robust and complete; consider using abspath.

__all__ = ['relpath']

from os.path import join
from os.path import sep

[docs]def relpath(p1, p2): """Compute the relative path of p1 with respect to p2.""" def commonpath(L1, L2, common=[]): if len(L1) < 1: return (common, L1, L2) if len(L2) < 1: return (common, L1, L2) if L1[0] != L2[0]: return (common, L1, L2) return commonpath(L1[1:], L2[1:], common=common+[L1[0]]) # if the strings are equal, then return "." if p1 == p2: return "." (common,L1,L2) = commonpath(p2.split(sep), p1.split(sep)) # if there is nothing in common, then return an empty string if not common: return "" # otherwise, replace the common pieces with "../" (or "..\") p = [(".."+sep) * len(L1)] + L2 return join(*p)
def test(): p1 = sep.join(["a","b","c","d"]) p2 = sep.join(["a","b","c1","d1"]) p3 = sep.join(["a","b","c","d","e"]) p4 = sep.join(["a","b","c","d1","e"]) p5 = sep.join(["w","x","y","z"]) assert relpath(p1, p1) == "." assert relpath(p2, p1) == sep.join(["..", "..", "c1", "d1"]) assert relpath(p3, p1) == "e" assert relpath(p4, p1) == sep.join(["..", "d1", "e"]) assert relpath(p5, p1) == "" if __name__ == '__main__': test()