1

为澄清起见,我正在从头开始重写附加信息。

考虑以下:

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
4

4 回答 4

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
于 2012-08-01T18:54:22.630 回答
1

您的最后一个代码位是正确的,也可以使用原始字符串编写:

y = r'\x' + x[2: len(x)]

正如 cdhowie 在他的回答中所说:

当您在 Python 控制台中键入变量的名称时,Python 会将字符串的表示形式打印为 Python 代码。这段代码确实有效,结果的表示只是让你失望。

然而,这是手写转义序列的一种替代方法,我认为这是一种更好的编码实践,因为它更具可读性。

于 2012-08-01T18:54:00.857 回答
0

如果您只是想在控制台获取字符串\0x4b0作为表示,则需要在控制台实际调用print它:

>>> s='\\0{}'.format(hex(1200)[1:])
>>> s
'\\0x4b0'
>>> print s
\0x4b0
>>> s2='\\0'+hex(1200)[1:]
>>> s2
'\\0x4b0'
>>> print s2
\0x4b0

如果您只是在控制台中 FORM 字符串(即,它不会通过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

字符串插值是这些字符串文字的过程:

>>> s1
'\n\n\t\tline'

翻译成这样:

>>> print s


       line

从逻辑上讲,这些文字字符是单个字符:

>>> s1[0]
'\n'
>>> len('\\')
1

我的猜测是您打开串行端口的方式s是使用字符串是原始模式,因此字符串\\x0123是以这种方式发送(原始模式)而不是被解释为\x0123

您可以尝试解决此问题:

>>> cmd=chr(92)+'0'+hex(1200)[1:]
>>> s.write(cmd)

我认为您还需要在FileLike模式下打开串行端口,以便将字符串文字作为正确的单个字符发送。

于 2012-08-01T19:05:48.777 回答
0

后者将起作用。在控制台中,Python 使用repr()打印对象,在这种情况下将显示双斜杠。在控制台中执行print y,您会看到它正确输出。

您还可以稍微清理一下您的第一个示例:

y = "\\x" + x[2:]

或者第二个:

y = "\\" + x[1:]
于 2012-08-01T18:55:41.420 回答