2013-01-18 94 views
0

我處於一種情況,我必須使用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很新。是否有一種方法可以在讀入字符串後自動切斷字符串中的數據?

+0

如果有什麼多餘的垃圾恰好包含可打印字符? –

回答

4

你的意思是這樣的:

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

作爲一個方面說明,我是** SHOCKED **與'過濾器'返回了一個字符串...我有點希望他們保持python3.x中的這種行爲... – mgilson

+0

這實際上正是我正在尋找。問題是我正在使用一些自定義的Python構建嵌入式系統。我無法訪問庫中的字符串函數。所以filter()不可用。 – linsek

+0

@njozwiak - 'filter'是一個python builtin - 它不在字符串函數庫中。 – mgilson

相關問題