[英]String formating with Python's escape sequence
為了澄清目的,我從頭開始重寫其他信息。
考慮以下:
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
你的最后一段代碼不符合你的想法:
>>> x = hex(1200)
>>> y = '\\' + x[1: len(x)]
>>> y
'\\x4b0'
>>> print y
\x4b0
當您在Python控制台中鍵入變量的名稱時,Python會將字符串的表示形式打印為Python代碼 ,這就是您看到兩個反斜杠的原因 - Python字符串中的文字反斜杠會被另一個反斜杠轉義。 這段代碼確實有效,結果的表示只是讓你失望。
但是,我建議您使用此代碼段,因為您的代碼會忽略前導零:
>>> y = '\\x%04x' % 1200
>>> print y
\x04b0
您的最后一個代碼位是正確的,也可以使用原始字符串寫入:
y = r'\x' + x[2: len(x)]
正如cdhowie在他的回答中所說:
在Python控制台中鍵入變量名稱時,Python會將字符串的表示形式打印為Python代碼。 這段代碼確實有效,結果的表示只是讓你失望。
然而,這是手寫轉義序列的另一種選擇,我認為這是一種稍好的編碼實踐,因為它更具可讀性。
后者將起作用。 在控制台中,Python使用repr()
來打印對象,在這種情況下將顯示雙斜杠。 在控制台中print y
,你會看到它正確輸出。
你也可以稍微清理你的第一個例子:
y = "\\x" + x[2:]
或者第二個:
y = "\\" + x[1:]
如果您只是嘗試將字符串\\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'
編輯(根據您的評論):
我認為這是一台老惠普繪圖儀?
不要對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
正在以這種方式發送(原始模式)vs被解釋為\\x0123
您可以嘗試解決此問題:
>>> cmd=chr(92)+'0'+hex(1200)[1:]
>>> s.write(cmd)
我認為您還需要在FileLike模式下打開串口,以便將字符串文字作為正確的單個字符發送。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.