New code for split() by Tim Peters, behaves more like posixpath.split().

This commit is contained in:
Guido van Rossum 1999-03-19 21:05:12 +00:00
parent d7b5fb858c
commit 8f0fa9e47f
2 changed files with 25 additions and 40 deletions

View file

@ -54,31 +54,23 @@ def splitdrive(p):
# Split a path in head (everything up to the last '/') and tail (the # Split a path in head (everything up to the last '/') and tail (the
# rest). If the original path ends in '/' but is not the root, this # rest). After the trailing '/' is stripped, the invariant
# '/' is stripped. After the trailing '/' is stripped, the invariant
# join(head, tail) == p holds. # join(head, tail) == p holds.
# The resulting head won't end in '/' unless it is the root. # The resulting head won't end in '/' unless it is the root.
def split(p): def split(p):
d, p = splitdrive(p) d, p = splitdrive(p)
slashes = '' # set i to index beyond p's last slash
while p and p[-1:] in '/\\': i = len(p)
slashes = slashes + p[-1] while i and p[i-1] not in '/\\':
p = p[:-1] i = i - 1
if p == '': head, tail = p[:i], p[i:] # now tail has no slashes
p = p + slashes # remove trailing slashes from head, unless it's all slashes
head, tail = '', '' head2 = head
for c in p: while head2 and head2[-1] in '/\\':
tail = tail + c head2 = head2[:-1]
if c in '/\\': head = head2 or head
head, tail = head + tail, '' return d + head, tail
slashes = ''
while head and head[-1:] in '/\\':
slashes = slashes + head[-1]
head = head[:-1]
if head == '':
head = head + slashes
return d + head, tail
# Split a path in root and extension. # Split a path in root and extension.

View file

@ -77,8 +77,7 @@ def splitdrive(p):
# Split a path in head (everything up to the last '/') and tail (the # Split a path in head (everything up to the last '/') and tail (the
# rest). If the original path ends in '/' but is not the root, this # rest). After the trailing '/' is stripped, the invariant
# '/' is stripped. After the trailing '/' is stripped, the invariant
# join(head, tail) == p holds. # join(head, tail) == p holds.
# The resulting head won't end in '/' unless it is the root. # The resulting head won't end in '/' unless it is the root.
@ -87,24 +86,18 @@ def split(p):
Return tuple (head, tail) where tail is everything after the final slash. Return tuple (head, tail) where tail is everything after the final slash.
Either part may be empty.""" Either part may be empty."""
d, p = splitdrive(p) d, p = splitdrive(p)
slashes = '' # set i to index beyond p's last slash
while p and p[-1:] in '/\\': i = len(p)
slashes = slashes + p[-1] while i and p[i-1] not in '/\\':
p = p[:-1] i = i - 1
if p == '': head, tail = p[:i], p[i:] # now tail has no slashes
p = p + slashes # remove trailing slashes from head, unless it's all slashes
head, tail = '', '' head2 = head
for c in p: while head2 and head2[-1] in '/\\':
tail = tail + c head2 = head2[:-1]
if c in '/\\': head = head2 or head
head, tail = head + tail, ''
slashes = ''
while head and head[-1:] in '/\\':
slashes = slashes + head[-1]
head = head[:-1]
if head == '':
head = head + slashes
return d + head, tail return d + head, tail