删除转义字符python


temp = str(read_temp())
### temp is 29.12
temp = binascii.hexlify(temp)
### now temp is 32392e3132
n = 2
ta = [temp[i:i+n] for i in range(0, len(temp), n)]
### now ta[0]=32 ta[1]=39 ta[2]=2e ta[3]=31 ta[4]=32 
print(type(ta[0]))
data_send = r'x00x00x00x00x'+ta[0]+r'x'+ta[1]+r'x'+ta[2]+r'x'+ta[3]+r'x'+ta[4]
data_send = literal_eval("'%s'" %data_send) # that can be delete
yield Task(self.send, data_send)

嗨,python version=2.7.1.6

我读取了温度。温度示例为29.22*C。我想像ascii代码一样将这个温度值添加到data_send中。然后,我将在iec104协议上发送龙卷风网络服务器上的数据。当我打印数据时,结果是CCD_ 2。我想像'x00x00x00x00x32x38x2ex38x37'那样更改这些数据。但结果是这样的:\x00\x00\x00\x00\x32\x38\x2e\x38\x37

我想删除这个额外的转义字符

请帮我

您使用的是前缀为r的字符串(原始字符串(。在原始字符串中,任何反斜杠都是按字面意思解释的,而不是转义符。如果您想要一个字符串,其中每个字符都有您正在编码的实际十六进制值,如'x00'代表0,请从字符串中删除r前缀。

然后,在打印字符串时,使用repr函数反转编码(即查看使用的转义序列(:

>>> s = b"x61x00x12"
>>> print(repr(s))
b'ax00x12'

请注意,与可打印字符(如上面的x61(相对应的任何十六进制值都将显示为实际字符(在这种情况下为a(,而不是转义序列。

该字符串将包含用十六进制转义序列编码的实际值:

>>> print(*s)
97 0 18

如果您只想要一个文字转义序列字符串,无论该字符是否可打印,都必须手动执行。

给定要编码为十六进制序列的数字列表,

nums = [97, 0, 18]

你可以做

escaped = ''.join(r'x{:02x}'.format(num) for num in nums)

(在格式规范中,0是填充字符,2是宽度,x表示十六进制(。现在,如果您打印escaped,您将看到一串转义序列:

>>> print(escaped)
x61x00x12

如果您需要在四个空字符之后以纯文本字符的形式发送温度,这将起作用:

temp = str(read_temp())
data_send = b'x00x00x00x00' + temp.encode('ascii')
yield Task(self.send, data_send)

此外,只是:

print(b'x00x00x00x00' + '28.87'.encode('ascii'))

结果:

b'x00x00x00x0028.87'

这正是您所需要的,即一个字节串,四个chr(0),后面跟着一个chr(0x32)chr(0x38)'x00x00x00x0028.87'0、chr(0x38)chr(0x37)

当然,除非服务以某种方式期望数据的Python字符串表示,这可能有点奇怪,但并非不可能。

最新更新