这是一个非常奇怪的情况,split函数正在更改字符串格式。请看下面的代码,
代码:
COM_Port = serial.Serial(COM_PortName)
with COM_Port as port:
while True:
RxedData = port.readline()
line = RxedData.decode('utf-8')
print("Line 1: ", line)
row = line.split(',')[1:-1]
print("Line 2: ", row)
输出:
Line 1: "* , 0 0 0 0 0 5 7 5 , 2 3 : 0 3 : 4 7 , 1 1 / 0 2 / 2 0 , 1 2 . 3 4 5 , K P A , 0 0 0 0 6 . 8 3 , S L P M , T B , , $ "
Line 2: ['\x000\x000\x000\x000\x000\x006\x002\x001\x00', '\x002\x000\x00:\x004\x006\x00:\x005\x001\x00', '\x001\x002\x00/\x000\x002\x00/\x002\x000\x00', '\x001\x002\x00.\x003\x004\x005\x00', '\x00K\x00P\x00A\x00', '\x000\x000\x000\x000\x000\x00.\x000\x000\x00', '\x00C\x00C\x00P\x00M\x00', '\x00T\x00G\x00', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00']
Line 2
如何进入\x000\x000...
?这种编码格式是什么?如何将其转换为正确的格式?
决定将我的评论变成答案(主要是为了让我包括代码)。
这两行的打印方式不同,因为您要打印不同的内容。在
Line 1
上,您将直接打印字符串,因此Line 2
上,您现在正在打印一个列表,因此在
您的line
字符串在解码后很可能在其中嵌入了\x00
(NULL)字节而不是ASCII空格(\x20
)。
>>> x = '*\x00,\x000\x000\x000\x000\x000\x005\x007\x005\x00'
>>> print(x)
'* , 0 0 0 0 0 5 7 5 ,'
>>> print(x.split(','))
['*\x00', '\x000\x000\x000\x000\x000\x005\x007\x005\x00']
要修改我引用的注释,这似乎是基于任何正在打印字符的控制台。我从cmd和PowerShell中获得了上述输出,但是Jupyter Notebook却打印了此输出:*,00000575
。请注意,“空格”现在消失了。
[如果我将\x00
的一些字节改为\x20
,则Jupyter然后将打印您在上方看到的内容(至少在替换它们的位置)。这只是为了显示NULL字符和空格字符可以视觉上看起来完全相同,这取决于显示它们的控制台。
>>> x = '*\x20,\x200\x200\x000\x000\x000\x005\x007\x005\x00'
>>> print(x)
* , 0 0000575