我是python的新手,我想在类构造函数中解析一些数据。输入的是一个带有十六进制分隔符的字符串。
b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
然后我想分割这个字符串,对于每个分割,我想把结果解码为utf-8,以丢弃我不感兴趣的其他字符。
data = b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
frames = data.split(b'\x02')
utf_frames = [frame.decode('utf-8') for frame in frames]
print(utf_frames)
# Prints:
# ['\x01', 'A610088906\x03', 'R1138\x03', 'C\x03', 'B610089002\x03', 'SG20L71800\x03', 'MGFS4470\x03', 'm\x03', 'I47\x03\x04']
如果我改成这样写我的列表理解,我可以看到打印出来的解码值。
[print(frame.decode('utf-8')) for frame in frames]
A610088906
R1138
B610089002
SG20L71800
MGFS4470
我正在使用3.8.5版本。
我做错了什么?
为了清楚起见,这是我想实现的目标(但我不想每次要找到一帧时都要对所有条目进行解码)。
data = b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
frame_identifier = 'M'
frame = [frame for frame in data.split(b'\x02') if frame.decode('utf-8').startswith(frame_identifier)][0].decode('utf-8')[1:]
print(frame)
# GFS4470
Solution
谢谢你的回答,我发现了悬空的\x03
,因为我把它解码为utf-8字符串,所以不可见。这现在可以了。
frame_identifier = 'M'
data = b'\x01\x02A610088906\x03\x02R1138\x03\x02C\x03\x02B610089002\x03\x02SG20L71800\x03\x02MGFS4470\x03\x02m\x03\x02I47\x03\x04'
utf_frames = [frame.decode('utf-8') for frame in data.split(b'\x02')]
frame = [frame for frame in self.utf_frames if frame.startswith(frame_identifier)][0][1:-1]
print(type(frame), frame, str(frame), repr(frame))
# <class 'str'> GFS4470 GFS4470 'GFS4470'