diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index 2ccfbcb..21b9e52 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -36,7 +36,6 @@
 
 import os
 import sys
-import string
 
 # Import SOCKS module if it exists, else standard socket module socket
 try:
@@ -266,7 +265,7 @@
         if af == 0:
             raise error_proto, 'unsupported address family'
         fields = ['', `af`, host, `port`, '']
-        cmd = 'EPRT ' + string.joinfields(fields, '|')
+        cmd = 'EPRT ' + '|'.join(fields)
         return self.voidcmd(cmd)
 
     def makeport(self):
@@ -585,18 +584,18 @@
 
     if resp[:3] <> '229':
         raise error_reply, resp
-    left = string.find(resp, '(')
+    left = resp.find('(')
     if left < 0: raise error_proto, resp
-    right = string.find(resp, ')', left + 1)
+    right = resp.find(')', left + 1)
     if right < 0:
         raise error_proto, resp # should contain '(|||port|)'
     if resp[left + 1] <> resp[right - 1]:
         raise error_proto, resp
-    parts = string.split(resp[left + 1:right], resp[left+1])
+    parts = resp[left+1].split(resp[left + 1:right])
     if len(parts) <> 5:
         raise error_proto, resp
     host = peer[0]
-    port = string.atoi(parts[3])
+    port = int(parts[3])
     return host, port
 
 
diff --git a/Lib/markupbase.py b/Lib/markupbase.py
index 57d3ae4..ae19869 100644
--- a/Lib/markupbase.py
+++ b/Lib/markupbase.py
@@ -38,10 +38,10 @@
         if i >= j:
             return j
         rawdata = self.rawdata
-        nlines = string.count(rawdata, "\n", i, j)
+        nlines = rawdata.count("\n", i, j)
         if nlines:
             self.lineno = self.lineno + nlines
-            pos = string.rindex(rawdata, "\n", i, j) # Should not fail
+            pos = rawdata.rindex("\n", i, j) # Should not fail
             self.offset = j-(pos+1)
         else:
             self.offset = self.offset + j-i
@@ -176,7 +176,7 @@
         # style content model; just skip until '>'
         rawdata = self.rawdata
         if '>' in rawdata[j:]:
-            return string.find(rawdata, ">", j) + 1
+            return rawdata.find(">", j) + 1
         return -1
 
     # Internal -- scan past <!ATTLIST declarations
@@ -200,7 +200,7 @@
             if c == "(":
                 # an enumerated type; look for ')'
                 if ")" in rawdata[j:]:
-                    j = string.find(rawdata, ")", j) + 1
+                    j = rawdata.find(")", j) + 1
                 else:
                     return -1
                 while rawdata[j:j+1] in string.whitespace:
@@ -307,7 +307,7 @@
             name = s.strip()
             if (i + len(s)) == n:
                 return None, -1  # end of buffer
-            return string.lower(name), m.end()
+            return name.lower(), m.end()
         else:
             self.updatepos(declstartpos, i)
             self.error("expected name token")
diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py
index c9a1ccd..251df27 100755
--- a/Lib/tabnanny.py
+++ b/Lib/tabnanny.py
@@ -261,12 +261,11 @@
         return a
 
 def format_witnesses(w):
-    import string
     firsts = map(lambda tup: str(tup[0]), w)
     prefix = "at tab size"
     if len(w) > 1:
         prefix = prefix + "s"
-    return prefix + " " + string.join(firsts, ', ')
+    return prefix + " " + ', '.join(firsts)
 
 def process_tokens(tokens):
     INDENT = tokenize.INDENT
