Python列表的理解力没有分配给新的数组

0 人关注

我是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'
    
5 个评论
正在使用linux吗?
Yes, Ubuntu 20.04
/xo3 is ^c character; the ctrl + c .
为什么当我不分配到一个列表时,所有的框架都被打印出来?替换代码0】不是也应该导致问题吗?
是的,这就是问题所在,我似乎无法重现这一点,因为我在Linux和WINDOWS中也得到一个空白的方框字符;这也是预料之中的事。
python
list-comprehension
jokarl
jokarl
发布于 2020-12-11
2 个回答
Booboo
Booboo
发布于 2020-12-11
已采纳
0 人赞同

让我们回到你的第一个编码例子,稍微修改一下,看看发生了什么事。

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)
for f in utf_frames:
    print(type(f), f, str(f), repr(f))

Prints:

['\x01', 'A610088906\x03', 'R1138\x03', 'C\x03', 'B610089002\x03', 'SG20L71800\x03', 'MGFS4470\x03', 'm\x03', 'I47\x03\x04']
<class 'str'>   '\x01'
<class 'str'> A610088906 A610088906 'A610088906\x03'
<class 'str'> R1138 R1138 'R1138\x03'
<class 'str'> C C 'C\x03'
<class 'str'> B610089002 B610089002 'B610089002\x03'
<class 'str'> SG20L71800 SG20L71800 'SG20L71800\x03'
<class 'str'> MGFS4470 MGFS4470 'MGFS4470\x03'
<class 'str'> m m 'm\x03'