title: TypeError: a bytes-like object is required, not 'str' -python
body: <p>I am using python 3 and the code in line 42 is causing the problem</p>
  
  <blockquote>
    <p>line 42, in  print
    ('Retrieved',len(data),'characters',data[:20].replace('\n',' '))
    TypeError: a bytes-like object is required, not 'str'</p>
  </blockquote>
  
  <p>In my program line-42 is</p>
  
  <pre><code> print ('Retrieved',len(data),'characters',data[:20].replace('\n',' '))
  </code></pre>
  
  <p>I will greatly appreciate your help.</p>
  
  <p>below is the full colde:</p>
  
  <pre><code>import urllib
  import urllib.request
  import sqlite3
  import json
  import time
  import ssl
  
  # If you are in China use this URL:
  # serviceurl = "http://maps.google.cn/maps/api/geocode/json?"
  serviceurl = "http://maps.googleapis.com/maps/api/geocode/json?"
  
  # Deal with SSL certificate anomalies Python &gt; 2.7
  # scontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
  scontext = None
  
  conn = sqlite3.connect('geodata.sqlite')
  cur = conn.cursor()
  
  cur.execute('''
  CREATE TABLE IF NOT EXISTS Locations (address TEXT, geodata TEXT)''')
  
  fh = open("where.data", encoding="utf-8")
  count = 0
  for line in fh:
      if count &gt; 200 : break
      address = line.strip()
      print ('')
      cur.execute("SELECT geodata FROM Locations WHERE address= ?", ((address), ))
  
      try:
          data = cur.fetchone()[0]
          print ("Found in database ",address)
          continue
      except:
          pass
  
      print ('Resolving', address)
      url = serviceurl + urllib.parse.urlencode({"sensor":"false", "address": address})
      print ('Retrieving', url)
      uh = urllib.request.urlopen(url, context=scontext)
      data = uh.read()
      print ('Retrieved',len(data),'characters',data[:20].replace('\n',' '))
      count = count + 1
      try: 
          js = json.loads(str(data))
          # print js  # We print in case unicode causes an error
      except: 
          continue
  
      if 'status' not in js or (js['status'] != 'OK' and js['status'] != 'ZERO_RESULTS') : 
          print ('==== Failure To Retrieve ====')
          print (data)
          break
  
      cur.execute('''INSERT INTO Locations (address, geodata) 
              VALUES ( ?, ? )''', ( buffer(address),buffer(data) ) )
      conn.commit() 
      time.sleep(1)
  
  print ("Run geodump.py to read the data from the database so you can visualize it on a map.")
  </code></pre>