diff --git a/Lib/knee.py b/Lib/knee.py
index 95c3c23..64764da 100644
--- a/Lib/knee.py
+++ b/Lib/knee.py
@@ -7,7 +7,7 @@
 
 """
 
-import sys, imp, __builtin__, string
+import sys, imp, __builtin__
 
 
 # Replacement for __import__()
@@ -30,7 +30,7 @@
         assert globals is parent.__dict__
         return parent
     if '.' in pname:
-        i = string.rfind(pname, '.')
+        i = pname.rfind('.')
         pname = pname[:i]
         parent = sys.modules[pname]
         assert parent.__name__ == pname
@@ -39,7 +39,7 @@
 
 def find_head_package(parent, name):
     if '.' in name:
-        i = string.find(name, '.')
+        i = name.find('.')
         head = name[:i]
         tail = name[i+1:]
     else:
@@ -61,7 +61,7 @@
 def load_tail(q, tail):
     m = q
     while tail:
-        i = string.find(tail, '.')
+        i = tail.find('.')
         if i < 0: i = len(tail)
         head, tail = tail[:i], tail[i+1:]
         mname = "%s.%s" % (m.__name__, head)
@@ -111,7 +111,7 @@
     name = module.__name__
     if '.' not in name:
         return import_module(name, name, None)
-    i = string.rfind(name, '.')
+    i = name.rfind('.')
     pname = name[:i]
     parent = sys.modules[pname]
     return import_module(name[i+1:], name, parent)
diff --git a/Lib/macurl2path.py b/Lib/macurl2path.py
index a8be198..3c1acc0 100644
--- a/Lib/macurl2path.py
+++ b/Lib/macurl2path.py
@@ -2,7 +2,6 @@
 
 Do not import directly; use urllib instead."""
 
-import string
 import urllib
 import os
 
@@ -21,7 +20,7 @@
         pathname = pathname[2:]
     elif pathname[:2] == '//':
         raise RuntimeError, 'Cannot convert non-local URL to pathname'
-    components = string.split(pathname, '/')
+    components = pathname.split('/')
     # Remove . and embedded ..
     i = 0
     while i < len(components):
@@ -37,7 +36,7 @@
             i = i+1
     if not components[0]:
         # Absolute unix path, don't start with colon
-        rv = string.join(components[1:], ':')
+        rv = ':'.join(components[1:])
     else:
         # relative unix path, start with colon. First replace
         # leading .. by empty strings (giving ::file)
@@ -45,7 +44,7 @@
         while i < len(components) and components[i] == '..':
             components[i] = ''
             i = i + 1
-        rv = ':' + string.join(components, ':')
+        rv = ':' + ':'.join(components)
     # and finally unquote slashes and other funny characters
     return urllib.unquote(rv)
 
@@ -53,7 +52,7 @@
     "convert mac pathname to /-delimited pathname"
     if '/' in pathname:
         raise RuntimeError, "Cannot convert pathname containing slashes"
-    components = string.split(pathname, ':')
+    components = pathname.split(':')
     # Remove empty first and/or last component
     if components[0] == '':
         del components[0]
@@ -67,9 +66,9 @@
     components = map(_pncomp2url, components)
 
     if os.path.isabs(pathname):
-        return '/' + string.join(components, '/')
+        return '/' + '/'.join(components)
     else:
-        return string.join(components, '/')
+        return '/'.join(components)
 
 def _pncomp2url(component):
     component = urllib.quote(component[:31], safe='')  # We want to quote slashes
