New code for split() by Tim Peters, behaves more like posixpath.split().
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 @@
# 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 @@
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