【问题标题】:Howto Remove Garbage Data from String如何从字符串中删除垃圾数据
【发布时间】:2013-01-02 07:11:31
【问题描述】:

我必须使用 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 还很陌生。有没有办法在读入字符串后自动切断字符串中的数据?

【问题讨论】:

  • 如果多余的垃圾恰好包含可打印字符怎么办?

标签: python string parsing eeprom


【解决方案1】:

你的意思是这样的:

>>> 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))

【讨论】:

  • 作为旁注,我 震惊 filter 返回了一个字符串 ...我有点希望他们在 python3.x 中保留这种行为 ...
  • 这实际上正是我正在寻找的。问题是我正在使用一些定制的 Python 构建嵌入式系统。我无权访问库中的字符串函数。所以 filter() 不可用。
  • @njozwiak -- filter 是一个 python 内置函数 -- 它不在字符串函数库中。
  • 我现在明白了。在这个系统上它仍然不可用。我想我只需要做一些预写处理而不是读后处理。要么为值的长度写入一个字节,要么始终强制数据为静态长度。好痛啊……
  • @AdamCadien -- 什么是“字符串理解”? -- 问题是,如果 OP 无法访问 filter 这是一个 python 内置函数,那么很难猜测 OP 可以访问什么 ...
最近更新 更多