2014-03-05 48 views
1

我正試圖爲(解)序列化程序獲得一個好的解決方案。 我有一個格式與所有的價值就擺在使用格式模式將字符串反序列化爲值

格式模式如下:

msg = '$bla,%d,%02d,%02d %02d:%02d:%02d.%03d' % (kwargs['...'], ...) 

當我序列化的價值觀,我得到以下字符串:

bla,1990,12,24 13:37:11.001 

但我也必須反序列化它。該模式的長度和類型可能會有很大差異。 我想僅基於格式模式反序列化字符串。

任何想法如何實現?

編輯:我使用Python 2.7.6

回答

1

你也許可以用正則表達式來做到這一點,有一些假設。這是一個部分示例,您可能需要添加一個完整的解決方案。基本上,我們將每種打印格式轉換爲與其匹配的正則表達式,並將其分解。

import re 
formattuple = (1990,12,24,13,37,11,1) 
formatstr = 'bla,%d,%02d,%02d %02d:%02d:%02d.%03d' 

def rep_format(fmt): 
    fmt = fmt.group(0) 
    if fmt[0] != '%': 
     return fmt 
    if fmt == '%d': 
     return r'(\d+)' 
    ftype = fmt[-1] 
    if ftype == 'd': 
     fwidth = int(fmt[1:-1]) 
     return r'(\d{%d})'%(fwidth) 
    else: 
     return fmt 

scanstr = re.sub(r'%\d+[df]', rep_format, formatstr) 
scanstr 
'bla,(\\d+),(\\d{2}),(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})' 

fstr = formatstr%formattuple 
fstr 
'bla,1990,12,24 13:37:11.001' 

match = re.match(scanstr, fstr) 
match.groups() 
('1990', 
'12', 
'24', 
'13', 
'37', 
'11', 
'001') 
mtuple = tuple(int(x) for x in match.groups()) 
2

如果你可以完全控制的協議,或者說format after serialization,我建議使用一些現有的解決方案,例如,由Python標準庫提供PickleJson這在網絡非常流行,或Protobuf這是跨語言提供由谷歌

Pickle

>>> import pickle 
>>> formattuple = (1990,12,24,13,37,11,1) 
>>> s = pickle.dumps(formattuple) 
>>> s 
'(I1990\nI12\nI24\nI13\nI37\nI11\nI1\ntp0\n.' 
>>> pickle.loads(s) 
(1990, 12, 24, 13, 37, 11, 1) 

Json

>>> import json 
>>> formattuple = (1990,12,24,13,37,11,1) 
>>> s = json.dumps(formattuple) 
>>> s 
'[1990, 12, 24, 13, 37, 11, 1]' 
>>> json.loads(s) 
[1990, 12, 24, 13, 37, 11, 1] 

請注意,json有一些限制,比如字典,列表和元組以外的其他對象更難以序列化和反序列化。並且不會反序列化爲完全相同的格式,因爲某些數據結構(如元組)不存在於json中

Protobuf是更強大但更復雜的解決方案。您需要首先定義數據模式。

+0

不幸的是我無法控制協議。傳入的字符串總是與我發佈的字符串類似。 – Josch

相關問題