簡體   English   中英

使用Python的轉義序列進行字符串格式化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM