2010-10-19 33 views
7

Tôi muốn thực hiện (và giải mã) một chuỗi bao gồm một số dưa chua trăn.Python Pickle có ký tự/chuỗi bất hợp pháp mà tôi có thể sử dụng làm dấu phân cách không?

Có một ký tự hoặc chuỗi nào an toàn để sử dụng làm dấu phân cách trong chuỗi này không?

Tôi nên có thể làm cho các chuỗi như vậy:

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

Tôi nên có thể tận chuỗi này và tái tạo lại đối tượng như vậy:

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

gì cần PICKLE_SEPARATOR được?


Đối với tò mò, tôi muốn gửi các đối tượng đã được rọi để làm lại bằng APPEND. (mặc dù có lẽ tôi sẽ chỉ sử dụng RPUSH)

+0

Kể từ khi giá trị redis có thể sưu tập các chuỗi, tại sao bạn không chỉ lưu trữ mỗi một cách riêng biệt? – martineau

Trả lời

-1

Một giải pháp sẽ là thêm chuỗi chuỗi dưa chua của bạn với dữ liệu về số lượng ký tự mà mỗi thành phần cấu thành chứa.

2

Tôi không sử dụng Python nhiều, nhưng có lý do nào mà bạn không thể chỉ chọn một mảng thay thế không? Vì vậy, tẩy trở nên

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

và tái thiết trở thành

objs = pickle.loads(s) 

Sửa 1: Ngoài ra, theo this answer, sản lượng muối là tự chấm dứt; do đó, bạn có thể dưa với

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

và khôi phục với

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

Tôi không chắc chắn có một lợi ích này, mặc dù. (Mặc dù tôi đã không nhìn thấy một, có thể cũng có một cách tốt hơn so với vòng lặp khó chịu/kết hợp ngoại lệ, như tôi đã nói, tôi không sử dụng Python nhiều.)

+0

Rất tiếc, điều này sẽ không hoạt động đối với luồng.Tôi cần phải đọc chuỗi một cách riêng biệt vì tôi không thể sử dụng pickle 'load' nhưng chỉ' load' – VF1

2

EDIT: Đầu tiên xem xét câu trả lời của gnibbler, mà rõ ràng là đơn giản hơn nhiều. Lý do duy nhất để thích cái dưới đây là nếu bạn muốn có thể tách một chuỗi các dưa chua mà không cần phân tích chúng.

Đặt cược khá an toàn là sử dụng UUID hoàn toàn mới mà bạn không bao giờ sử dụng lại ở bất kỳ nơi nào khác. Đánh giá uuid.uuid4().bytes một lần và lưu trữ kết quả trong mã của bạn làm dấu phân cách. Ví dụ:

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

Sau đó sao chép - dán chuỗi kết quả vào mã của bạn làm dấu phân tách (hoặc thậm chí chỉ sử dụng chuỗi ở trên, nếu bạn muốn). Nó là khá nhiều đảm bảo rằng cùng một trình tự sẽ không bao giờ xảy ra trong bất cứ điều gì bạn đã bao giờ muốn lưu trữ.

7

Đó là tốt để chỉ cho nối dưa chua với nhau, Python biết nơi mỗi một kết thúc

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

Một lưu ý tiềm năng: điều này không làm việc cho các chuỗi, chỉ các đối tượng giống như tệp: try 'pickle.load (s)' ba lần, chỉ có 'dict' được trả về. –

Các vấn đề liên quan