Python AttributeError: ‘str’ object heeft geen attribuut ‘decode’

Ik werk aan een project op Python dat basis-TCP-communicatie met logboeken mogelijk maakt. Maar de gegevens die worden ontvangen, worden ontvangen met een b-prefix.

Na vele uren van het oplossen van andere fouten, kom ik uit bij deze laatste fout die altijd optreedt en die ik niet kan oplossen. Na een paar dagen wat onderzoek te hebben gedaan, kwam ik erachter dat het voorvoegsel b deel uitmaakt van de gegevensreeks en wanneer ik print(data.decode()) of print(data.decode(‘utf-8’) probeer te gebruiken, krijg de fout:

2018-06-21 21:17:38,801 STCP STOPPED DUE TO ERROR ON main.py, main()
Traceback (most recent call last):
  File "main.py", line 14, in main
    receiver.receive()
  File "D:\SecureNetworks\SecureTCP\receiver.py", line 26, in receive
    print(data.decode('utf-8'))
AttributeError: 'str' object has no attribute 'decode'

De server draait op Python 3.6 en de client op Python 2.7

Hier is mijn servercode:

main.py

import logging
import receiver
import config
logger = logging.getLogger(config.log)
hdlr = logging.FileHandler(str(config.log) + '.log')
formatter = logging.Formatter('%(asctime)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.DEBUG)
def main():
    try:
        logger.info("STCP has started.")
        receiver.receive()
    except ConnectionResetError:
        print("Client has disconnected.")
        logger.info("Client has disconnected.")
    except:
        print("STCP STOPPED DUE TO ERROR ON main.py, main()")
        logger.exception("STCP STOPPED DUE TO ERROR ON main.py, main()")
if __name__ == '__main__':
    main()`

ontvanger.py

import socket
import logging
import config
logger = logging.getLogger(config.log)
hdlr = logging.FileHandler(str(config.log) + '.log')
formatter = logging.Formatter('%(asctime)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.DEBUG)
TCP_IP = config.host
TCP_PORT = config.port
BUFFER_SIZE = config.buffersize
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
logger.info("STCP receiver has began on " + str(TCP_IP) + ":" +  str(TCP_PORT))
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
logger.info("Connection accepted from " + str(addr))
def receive():
    while 1:
        data = conn.recv(BUFFER_SIZE)
        if not data: break
        data = str(data)
        print(data.decode('utf-8'))
        conn.send(bytes(data, 'UTF-8'))
        logger.info(data)
    conn.close() 

En de client.py

#!/usr/bin/env python
import socket
import getpass
TCP_IP = '192.168.0.5'
TCP_PORT = 6430
BUFFER_SIZE = 1
MESSAGE = "Test"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

Als ik de .decode() verwijder, gaan de binnenkomende gegevens als volgt:

b'T'
b'e'
b's'
b't'

Antwoord 1, autoriteit 100%

Om te citeren uit een bestaand antwoordop een soortgelijk probleem:

U probeert een object te decoderen dat al is gedecodeerd. Je hebt een str, het is niet meer nodig om te decoderen van UTF-8.

Specifiek voor uw vraag, hier is het probleem:

   data = str(data)
    print(data.decode('utf-8'))

data = str(data)heeft dataal geconverteerd naar een string en dan probeer je het opnieuw te decoderen met data.decode(utf-8').

De oplossing is eenvoudig, verwijder gewoon de data = str(data)-instructie (of verwijder de decode-instructie en doe gewoon print(data))

Other episodes