Python AttributeError:';str';对象没有属性';解码';
我正在从事一个Python项目,该项目允许与日志进行基本TCP通信。但是正在接收的数据是使用b前缀接收的 在对其他错误进行了许多小时的故障排除之后,我最终发现了这个经常发生的错误,我似乎无法修复。在做了几天的研究之后,我发现b前缀是数据字符串的一部分,每当我尝试使用print(data.decode())或print(data.decode('utf-8')时,我都会得到错误:Python AttributeError:';str';对象没有属性';解码';,python,Python,我正在从事一个Python项目,该项目允许与日志进行基本TCP通信。但是正在接收的数据是使用b前缀接收的 在对其他错误进行了许多小时的故障排除之后,我最终发现了这个经常发生的错误,我似乎无法修复。在做了几天的研究之后,我发现b前缀是数据字符串的一部分,每当我尝试使用print(data.decode())或print(data.decode('utf-8')时,我都会得到错误: 2018-06-21 21:17:38,801 STCP STOPPED DUE TO ERROR ON main.p
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'
服务器在Python3.6上运行,客户端在Python2.7上运行
这是我的服务器代码:
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()`
接收器.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()
还有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()
此外,当我删除.decode()时,传入的数据如下所示:
b'T'
b'e'
b's'
b't'
引用一个类似问题的例子:
您正在尝试解码已解码的对象。如果您有str,则不再需要从UTF-8解码
针对您的问题,以下是问题:
data=str(data)
已将数据
转换为字符串,然后您尝试使用data.decode(utf-8')
再次对其进行解码
解决方案很简单,只需删除data=str(data)
语句(或删除decode语句,只需执行print(data)
)引用一个类似的问题:
您正在尝试解码已解码的对象。如果您有str,则不再需要从UTF-8解码
针对您的问题,以下是问题:
data=str(data)
已将数据
转换为字符串,然后您尝试使用data.decode(utf-8')
再次对其进行解码
解决方案很简单,只需删除data=str(data)
语句(或者删除decode语句,只需执行print(data)
)
data = str(data)
print(data.decode('utf-8'))