2010-10-19 7 views
7

मैं कई पायथन अचार से बना एक स्ट्रिंग बनाना (और डीकोड) बनाना चाहता हूं।क्या पाइथन पिकल में एक अवैध चरित्र/अनुक्रम है जिसे मैं विभाजक के रूप में उपयोग कर सकता हूं?

क्या कोई ऐसा वर्ण या अनुक्रम है जो इस स्ट्रिंग में विभाजक के रूप में उपयोग करने के लिए सुरक्षित है?

s = pickle.dumps(o1) + PICKLE_SEPARATOR + pickle.dumps(o2) + PICKLE_SEPARATOR + pickle.dumps(o3) ... 

मैं तो जैसे इस स्ट्रिंग लेने के लिए और वस्तुओं को फिर से संगठित करने के लिए सक्षम होना चाहिए::

[pickle.loads(s) for s in input.split(PICKLE_SEPARATOR)] 

क्या हो PICKLE_SEPARATOR चाहिए

मैं बहुत तरह स्ट्रिंग बनाने के लिए सक्षम होना चाहिए?


उत्सुकता के लिए, मैं ऐपेंड का उपयोग करके लालसा में मसालेदार वस्तुओं को भेजना चाहता हूं। (हालांकि शायद मैं केवल RPUSH का उपयोग करूंगा)

+0

के बाद से redis मानों को स्ट्रिंग्स का संग्रह हो सकता है, यही कारण है कि तुम सिर्फ हर एक को अलग से संग्रहीत नहीं करते हैं? – martineau

उत्तर

-1

एक समाधान डेटा के साथ अचार की अपनी स्ट्रिंग को प्रीपेड करना होगा कि प्रत्येक घटक तत्व में कितने अक्षर हैं।

2

मैं पाइथन का अधिक उपयोग नहीं करता, लेकिन क्या ऐसा कोई कारण है कि आप इसके बजाय एक सरणी नहीं चुन सकते? तो अचार बनाने

s = pickle.dumps([o1,o2,o3]) 

हो जाता है और पुनर्निर्माण

objs = pickle.loads(s) 

संपादित करें 1 हो जाता है: इसके अलावा, this answer के अनुसार, मसालेदार उत्पादन स्वयं समाप्त होता है; इस प्रकार, आप

s = ''.join(map(pickle.dumps,[o1,o2,o3])) 

साथ हालांकि अचार और बहाल

import StringIO 
sio = StringIO.StringIO(s) 
objs = [] 
try: 
    while True: objs.append(pickle.load(sio)) 
catch EOFError: 
    pass 

साथ मैं वहाँ इस के लिए एक लाभ है यकीन नहीं है सकता है। (हालांकि मैं एक नहीं देखा है, वहाँ अच्छी तरह से है कि बुरा पाश/अपवाद कॉम्बो की तुलना में एक बेहतर तरीका हो सकता है, जैसे मैंने कहा, मैं अजगर ज्यादा प्रयोग नहीं करते।)

+0

यह दुर्भाग्य से धाराओं के लिए काम नहीं करेगा।मुझे स्ट्रिंग को अलग से पढ़ने की जरूरत है क्योंकि मैं अचार 'लोड' का उपयोग नहीं कर सकता, लेकिन केवल' लोड ' – VF1

2

संपादित करें: पहले gnibbler के जवाब पर विचार करें, जो स्पष्ट रूप से बहुत आसान है। नीचे दिए गए को प्राथमिकता देने का एकमात्र कारण यह है कि यदि आप उन्हें पार्स किए बिना अचार के अनुक्रम को विभाजित करने में सक्षम होना चाहते हैं।

एक ब्रांड नई यूयूआईडी का उपयोग करने के लिए एक काफी सुरक्षित शर्त है कि आप कहीं और भी पुन: उपयोग नहीं करते हैं। एक बार uuid.uuid4().bytes का मूल्यांकन करें और परिणाम को अपने कोड में विभाजक के रूप में संग्रहीत करें। उदा .:

>>> import uuid 
>>> uuid.uuid4().bytes 
'\xae\x9fW\xff\x19cG\x0c\xb1\xe1\x1aV%P\xb7\xa8' 

फिर जिसके परिणामस्वरूप स्ट्रिंग शाब्दिक विभाजक के रूप में अपने कोड में कॉपी-पेस्ट (या यहाँ तक कि बस ऊपर से एक का उपयोग, अगर आप चाहते हैं)। यह बहुत अधिक गारंटी है कि वही अनुक्रम कभी भी आप जो भी स्टोर करना चाहते हैं उसमें कभी नहीं होगा।

7

यह सिर्फ एक साथ अचार कड़ी लगाकर जोड़ना ठीक है, अजगर जानता है, जहां हर एक को समाप्त होता है

>>> import cStringIO as stringio 
>>> import cPickle as pickle 
>>> o1 = {} 
>>> o2 = [] 
>>> o3 =() 
>>> p = pickle.dumps(o1)+pickle.dumps(o2)+pickle.dumps(o3) 
>>> s = stringio.StringIO(p) 
>>> pickle.load(s) 
{} 
>>> pickle.load(s) 
[] 
>>> pickle.load(s) 
() 
+2

एक संभावित गॉचाचा: यह तारों के लिए काम नहीं करता है, केवल फाइल जैसी वस्तुओं: 'pickle.load (ओं)' तीन बार, केवल 'dict' वापस आ गया है। –

संबंधित मुद्दे

 संबंधित मुद्दे