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