操作 python 中的字符串
Manipulate strings in python
我需要使用 mysql 中存储的数据来控制我的 xbee。数据库中包含 xbee 的长地址,用于识别我在网络上与哪个 xbee 通信。
下面的代码工作得很好,但在这个例子中我没有从数据库中检索地址。这只是一个有效的例子。
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr3, #<- this works!
command='D0',
parameter='\x04')
现在,一旦我从数据库中检索到 \x00\x13\xa2\x00@\n!\x1c(它存储为 varchar),我就会收到一条错误消息:
"% (字段['name'],字段['len']))
ValueError:为 'dest_addr_long' 提供的数据长度不是 8 个字节
这是代码(我在下面包含了六个打印行的输出以帮助调试)
with con:
cur = con.cursor()
cur.execute("SELECT addrlong, pinStatus FROM deviceStatus WHERE addrlong <>''")
for i in range(cur.rowcount):
row = cur.fetchone()
addr1 = row[0]
Status = row[1]
addr2 = repr(addr1)
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
print "Address1: %s" % addr1
print "Address2: %s" % addr2
print "Address3: %s" % addr3
print "Size of Addr1: %s" % sys.getsizeof(addr1)
print "Size of Addr2: %s" % sys.getsizeof(addr2)
print "Size of Addr3: %s" % sys.getsizeof(addr3)
if Status == 0: #turn off
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr2, #<-problem is here
command='D0',
parameter='\x04')
if Status == 1: #turn on
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr2, #<-problem is here
command='D0',
parameter='\x05')
输出为
Address1: \x00\x13\xa2\x00@\n!\x1c
Address2: '\x00\x13\xa2\x00@\n!\x1c'
Address3: ?@
!
Size of Addr1: 45
Size of Addr2: 53
Size of Addr3: 29
我显然只是简单地尝试了 dest_addr_long=addr1,
但无济于事。
我已经尝试了多种字符串操作组合,例如添加和删除括号以及 str 和 repr 的数十种组合,但我认为我完全走错了路。
我想我需要问的是为什么
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
print "Address3: %s" % addr3
输出
Address3: ?@
!
一旦我理解了这一点,那么我该如何操作数据库中的 addr1 以匹配 addr3,因为行 dest_addr_long=addr3,
工作得很好。
这是一个字节串的 ASCII 表示。例如\x00
表示00即NUL,\x13
表示ESC; @
和 !
是文字字符,但 \n
表示换行符。这就是它的 8 个字节长。
您可以通过使用 'string-escape':
解码来取回实际字节
>>> s='\x00\x13\xa2\x00@\n!\x1c'
>>> print s.decode('string-escape')
�@
!
(尽管打印结果在终端上看起来会有所不同)。
我需要使用 mysql 中存储的数据来控制我的 xbee。数据库中包含 xbee 的长地址,用于识别我在网络上与哪个 xbee 通信。
下面的代码工作得很好,但在这个例子中我没有从数据库中检索地址。这只是一个有效的例子。
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr3, #<- this works!
command='D0',
parameter='\x04')
现在,一旦我从数据库中检索到 \x00\x13\xa2\x00@\n!\x1c(它存储为 varchar),我就会收到一条错误消息: "% (字段['name'],字段['len'])) ValueError:为 'dest_addr_long' 提供的数据长度不是 8 个字节
这是代码(我在下面包含了六个打印行的输出以帮助调试)
with con:
cur = con.cursor()
cur.execute("SELECT addrlong, pinStatus FROM deviceStatus WHERE addrlong <>''")
for i in range(cur.rowcount):
row = cur.fetchone()
addr1 = row[0]
Status = row[1]
addr2 = repr(addr1)
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
print "Address1: %s" % addr1
print "Address2: %s" % addr2
print "Address3: %s" % addr3
print "Size of Addr1: %s" % sys.getsizeof(addr1)
print "Size of Addr2: %s" % sys.getsizeof(addr2)
print "Size of Addr3: %s" % sys.getsizeof(addr3)
if Status == 0: #turn off
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr2, #<-problem is here
command='D0',
parameter='\x04')
if Status == 1: #turn on
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr2, #<-problem is here
command='D0',
parameter='\x05')
输出为
Address1: \x00\x13\xa2\x00@\n!\x1c
Address2: '\x00\x13\xa2\x00@\n!\x1c'
Address3: ?@
!
Size of Addr1: 45
Size of Addr2: 53
Size of Addr3: 29
我显然只是简单地尝试了 dest_addr_long=addr1,
但无济于事。
我已经尝试了多种字符串操作组合,例如添加和删除括号以及 str 和 repr 的数十种组合,但我认为我完全走错了路。
我想我需要问的是为什么
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
print "Address3: %s" % addr3
输出
Address3: ?@ !
一旦我理解了这一点,那么我该如何操作数据库中的 addr1 以匹配 addr3,因为行 dest_addr_long=addr3,
工作得很好。
这是一个字节串的 ASCII 表示。例如\x00
表示00即NUL,\x13
表示ESC; @
和 !
是文字字符,但 \n
表示换行符。这就是它的 8 个字节长。
您可以通过使用 'string-escape':
解码来取回实际字节>>> s='\x00\x13\xa2\x00@\n!\x1c'
>>> print s.decode('string-escape')
�@
!
(尽管打印结果在终端上看起来会有所不同)。