简体   繁体   中英

deleting escape characters 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'\x00\x00\x00\x00\x'+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)

Hi, python version=2.7.1.6

I read the temperature. Example of temperature is 29.22 *C. I want to add this value of temperature to data_send like ascii code. Then i will send the data on tornado web server on iec104 protocol. when i print the data the result is '\\x00\\x00\\x00\\x0028.87' . I want to change this data like that '\\x00\\x00\\x00\\x00\\x32\\x38\\x2e\\x38\\x37' . But the result goes on like that: \\\\x00\\\\x00\\\\x00\\\\x00\\\\x32\\\\x38\\\\x2e\\\\x38\\\\x37

I want to delete this extra escaping character \\

Please help me

You're using r -prefixed strings (raw strings). Within raw strings, any backslashes are interpreted literally, not as an escape character. If you want a string in which each character has the actual hex value you're encoding, like '\\x00' for 0 , remove the r prefix from the string.

Then, when printing the string, use the repr function to reverse the encoding (ie to see the escape sequences used):

>>> s = b"\x61\x00\x12"
>>> print(repr(s))
b'a\x00\x12'

Note that any hex value that corresponds to a printable character (like x61 above) will be shown as the actual character ( a in this case), instead of the escape sequence.

The string will contain the actual values encoded with a hex escape sequence:

>>> print(*s)
97 0 18

If you just want a string of literal escape sequences, regardless of whether the character is printable or not, you'll have to do it manually.

Given a list of numbers you want to encode as hex sequences,

nums = [97, 0, 18]

you can do

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

(in the format specification, 0 is the fill character, 2 is the width, and x indicates hexadecimal). Now, if you print escaped , you will see a string of escape sequences:

>>> print(escaped)
\x61\x00\x12

If you need to send a temperature as plain text characters after four null characters, this will work:

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

Also, just:

print(b'\x00\x00\x00\x00' + '28.87'.encode('ascii'))

Result:

b'\x00\x00\x00\x0028.87'

Which is exactly what you need, ie a string of bytes, four chr(0) followed by a chr(0x32) , chr(0x38) , chr(0x2e) , chr(0x38) and chr(0x37) .

Unless of course the service somehow expects a Python string representation of the data, which would be more than a bit odd, but not impossible.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM