Python 3 TypeError: impossible de convertir implicitement l’objet ‘bytes’ en str

Python 3 TypeError: impossible de convertir l'objet "octets" en str implicitement

Conversion d'un exemple de socket Python 2 en Python 3

whois.py

import sys
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())

response = ""
while True:
    data = s.recv(4096)
    response += data
    if not data:
        break
s.close()
print(response)

Si la compilation avec Python 3, il invite l'erreur suivante?

Traceback (most recent call last):
  File "C:\repos\hc\whois\python\whois.py", line 12, in 
    response += data
TypeError: Can't convert 'bytes' object to str implicitly

Solution

En Python 3, le socket renvoie les données sous forme debytes (il s'agissait destring en Python 2). Comme la réponse est unstring, vous ne pouvez pas ajouter directement deux types différents (bytes + string). To fix it, vous devez convertir le type:

#Solution 1 Convertit la réponse destring to bytes

whois.py

import sys
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())

#Convert response to bytes
response = b""
# or use encode()
#response = "".encode()

while True:
    data = s.recv(4096)
    response += data
    if not data:
        break
s.close()
print(response.decode())

#Solution 2 Convertit les données debytes to string

whois.py

import sys
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())

response = ""
while True:
    data = s.recv(4096)
    #convert data from bytes to string
    #response += data
    response += data.decode()
    if not data:
        break
s.close()
print(response)