为了澄清目的,我正在从头开始重写其他信息。
请考虑以下事项:
y = hex(1200)
y
'0x4b0'
我需要用'\'替换y的前0,使其看起来像'\ x04b0'。我正在通过RS-232序列上的仪器进行通信,该仪器严格采用该格式的参数('\ xSumCharsHere')。 Python不会让我做以下事情。
z = '\x' + y[2:]
ValueError: invalid \x escape
以下是不可接受的,因为它在分配给z的实际值中仍然有'\\'。
z = '\\' + y[1:]
z
'\\x4b0'
最终目标是将这样的命令发送到我的串口:
s.write(z) # s is a serial object
s.write('\x04b0') # This call is an equivalent of the call above
s.write('\\x04b0') # This command will not work
答案 0 :(得分:2)
您的最后一段代码不符合您的想法:
>>> x = hex(1200)
>>> y = '\\' + x[1: len(x)]
>>> y
'\\x4b0'
>>> print y
\x4b0
当您在Python控制台中键入变量的名称时,Python会将字符串的表示形式打印为Python代码,这就是您看到两个反斜杠的原因 - Python字符串中的字面反斜杠被转义另一个领先的反斜杠。这段代码确实有效,结果的表示只会让你失望。
但是,我建议您使用此代码段,因为您的代码会忽略前导零:
>>> y = '\\x%04x' % 1200
>>> print y
\x04b0
答案 1 :(得分:1)
您的上一个代码位是正确的,也可以使用原始字符串写入:
y = r'\x' + x[2: len(x)]
正如cdhowie在答案中所说:
在Python控制台中键入变量名称时,Python会将字符串的表示形式打印为Python代码。这段代码确实有效,结果的表示只会让你失望。
然而,这是手写逃逸序列的替代方案,我认为编码练习稍微好一点,因为它更具可读性。
答案 2 :(得分:0)
后者将起作用。在控制台中,Python使用repr()
来打印对象,在这种情况下将显示双斜杠。在控制台中执行print y
,您会看到它输出正确。
你也可以稍微清理你的第一个例子:
y = "\\x" + x[2:]
或者第二个:
y = "\\" + x[1:]
答案 3 :(得分:0)
如果您只是尝试将字符串\0x4b0
作为控制台上的表示,则需要在控制台上实际调用print
:
>>> s='\\0{}'.format(hex(1200)[1:])
>>> s
'\\0x4b0'
>>> print s
\0x4b0
>>> s2='\\0'+hex(1200)[1:]
>>> s2
'\\0x4b0'
>>> print s2
\0x4b0
如果您只是在控制台中填充字符串(即,它不通过print
),Python会向您显示其表示形式:
>>> '\\0{}'.format(hex(1200)[1:])
'\\0x4b0'
>>> repr(s2)
"'\\\\0x4b0'"
>>> s2
'\\0x4b0'
修改(根据您的评论):
我认为这是一台旧HP绘图仪?
不要对shell显示为字符串的内容感到困惑。
您声明要生成一个\x<someNumGoesHere>
字符串(或\x0<someNumGoesHere>
字符串0
?
以下是:
>>> def angle_string(angle):
... return '\\0{}'.format(hex(angle)[1:])
...
>>> angle_string(1200)
'\\x04b0'
>>> print _
\x04b0
>>> angle_string(33)
'\\x021'
>>> print _
\x021
当您将字符串发送到您的设备时(通过OS文件/打印服务到RS232端口),它将与您格式化时一样。
修改2
字符串插值是这些string literals:
的过程>>> s1
'\n\n\t\tline'
翻译成这个:
>>> print s
line
逻辑上,这些文字字符是单个字符:
>>> s1[0]
'\n'
>>> len('\\')
1
我的猜测是你打开串口s
的方式是使用字符串是原始模式,所以字符串\\x0123
以这种方式发送(原始模式)vs被解释为{ {1}}
你可以尝试解决这个问题:
\x0123
我认为您还需要在FileLike模式下打开串口,以便将字符串文字作为正确的单个字符发送。