missing functions in os.path

François Pinard pinard at iro.umontreal.ca
Wed Sep 25 11:58:46 EDT 2002


[Simon Brunning]

> All patched gratefully received, I'm sure!

I sometimes use the following code (file name here is `nicepath.py').
The documentation is a bit terse, I confess! :-)


#!/usr/bin/env python
# Copyright © 2000, 2001, 2002 Progiciels Bourbeau-Pinard inc.
# François Pinard <pinard at iro.umontreal.ca>, 2000.

import os, string

def canonical(path, viewpoint=None):
    return string.join(canonical_parts(path, viewpoint), '/')

def nicest(path, viewpoint=None, relative=False):
    if viewpoint is None:
        eye_parts = canonical_parts(os.getcwd())
    else:
        eye_parts = canonical_parts(viewpoint)
    path_parts = canonical_parts(path, viewpoint)
    maximum = min(len(eye_parts), len(path_parts))
    for counter in range(maximum):
        if eye_parts[counter] != path_parts[counter]:
            break
    else:
        counter = maximum
    if relative or len(eye_parts) < 2*counter:
        return string.join((['..'] * (len(eye_parts) - counter)
                            + path_parts[counter:]),
                           '/')

def canonical_parts(path, viewpoint=None):

    def split_and_append(parts, name):
        for part in string.split(name, '/'):
            if part == '..':
                parts.pop()
            elif part != '.' and (part or not parts):
                parts.append(part)
        return parts

    if path[0] == '~':
        path = os.path.expanduser(path)
    elif path[0] != '/':
        if viewpoint is None:
            viewpoint = os.getcwd()
        path = os.path.join(viewpoint, path)
    parts = split_and_append([], path)
    counter = 0
    while counter < len(parts):
        name = string.join(parts[:1+counter], '/')
        if name and os.path.islink(name):
            link = os.readlink(name)
            if link[0] == '/':
                link_parts = split_and_append([], link)
            else:
                link_parts = split_and_append(parts[:counter], link)
            parts = link_parts + parts[1+counter:]
            counter = 0
        else:
            counter = counter + 1
    return parts

-- 
François Pinard   http://www.iro.umontreal.ca/~pinard





More information about the Python-list mailing list