From 8f0fa9e47f6bdad5bdc6155a0c83976d1f891fd7 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 19 Mar 1999 21:05:12 +0000 Subject: New code for split() by Tim Peters, behaves more like posixpath.split(). --- Lib/dospath.py | 34 +++++++++++++--------------------- Lib/ntpath.py | 31 ++++++++++++------------------- 2 files changed, 25 insertions(+), 40 deletions(-) diff --git a/Lib/dospath.py b/Lib/dospath.py index d7aa752..bd5e560 100644 --- a/Lib/dospath.py +++ b/Lib/dospath.py @@ -54,31 +54,23 @@ def splitdrive(p): # 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 -# '/' is stripped. After the trailing '/' is stripped, the invariant +# rest). After the trailing '/' is stripped, the invariant # join(head, tail) == p holds. # The resulting head won't end in '/' unless it is the root. def split(p): - d, p = splitdrive(p) - slashes = '' - while p and p[-1:] in '/\\': - slashes = slashes + p[-1] - p = p[:-1] - if p == '': - p = p + slashes - head, tail = '', '' - for c in p: - tail = tail + c - if c in '/\\': - 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 + d, p = splitdrive(p) + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in '/\\': + i = i - 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head2 = head + while head2 and head2[-1] in '/\\': + head2 = head2[:-1] + head = head2 or head + return d + head, tail # Split a path in root and extension. diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 9597c63..a74cce3 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -77,8 +77,7 @@ def splitdrive(p): # 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 -# '/' is stripped. After the trailing '/' is stripped, the invariant +# rest). After the trailing '/' is stripped, the invariant # join(head, tail) == p holds. # 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. Either part may be empty.""" + d, p = splitdrive(p) - slashes = '' - while p and p[-1:] in '/\\': - slashes = slashes + p[-1] - p = p[:-1] - if p == '': - p = p + slashes - head, tail = '', '' - for c in p: - tail = tail + c - if c in '/\\': - head, tail = head + tail, '' - slashes = '' - while head and head[-1:] in '/\\': - slashes = slashes + head[-1] - head = head[:-1] - if head == '': - head = head + slashes + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in '/\\': + i = i - 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head2 = head + while head2 and head2[-1] in '/\\': + head2 = head2[:-1] + head = head2 or head return d + head, tail -- cgit v0.12