如何从字符串中删除垃圾数据

时间:2013-01-18 14:41:12

标签: python string parsing eeprom

我遇到的情况是我必须使用Python来读取和写入嵌入式设备上的EEPROM。第一页(256字节)用于非易失性数据存储。我的问题是变量的长度可能不同,我需要读取固定的数量。

例如,字符串存储在地址30处,长度可以是6到10个字节。我需要读取最大可能的长度,因为我不知道它的结束位置。它的作用是它给了我字符串中多余的垃圾。

data_str = ee_read(bytecount)
dbgmsg("Reading from EEPROM: addr = " + str(addr_low) + " value = " + str(data_str))

> Reading from EEPROM: addr = 30 value = h11c13����

我是Python的新手。有没有办法在读入后自动切断字符串中的数据?

1 个答案:

答案 0 :(得分:5)

你的意思是:

>>> s = 'Reading from EEPROM: addr = 30 value = h11c13����'
>>> s
'Reading from EEPROM: addr = 30 value = h11c13\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd'
>>> filter(lambda x: ord(x)<128,s)
'Reading from EEPROM: addr = 30 value = h11c13'

在python3上,你需要join字符串:

''.join(filter(lambda x: ord(x)<128,s)

适用于python2和python3的版本是:

''.join(x for x in s if ord(x) < 128)

最后,可以肯定的是,多余的垃圾可能包含打印字符。在这种情况下,您可能只想要读取非打印字符,itertools.takewhile可能会有用...

import string #doesn't exist on python3.x, use the builtin `str` type instead.
from itertools import takewhile

printable = set(string.printable)  
''.join(takewhile(lambda x: x in printable, s))