Mam marynowanych danych od 2,7 że marynowanych tak:Unpickling dane z Pythonie 2 z ciągów Unicode w Pythonie 3
#!/usr/bin/env python2
# coding=utf-8
import pickle
data = {1: datetime.date(2014, 3, 18),
'string-key': u'ünicode-string'}
pickle.dump(data, open('file.pickle', 'wb'))
Jedynym sposobem znalazłem załadować to w Pythonie 3.4 jest:
data = pickle.load(open('file.pickle', "rb"), encoding='bytes')
Teraz mój ciąg znaków unicode jest w porządku, ale klucze dyktafonu są bytes
. print(repr(data))
daje:
{1: datetime.date(2014, 3, 18), b'string-key': 'ünicode-string'}
Czy ktoś ma pomysł, aby ominąć przepisywanie mój kod jak data[b'string-key']
wzgl. konwersja wszystkich istniejących plików?
Kiszone dane nie powinny działać w różnych wersjach i implementacjach i jest to dość zła metoda serializacji, nawet jeśli działa w ogóle, ponieważ wykonuje dowolny kod. Czy rozważałeś zamiast tego używać JSON? – geoffspear
Mam bardziej złożoną strukturę, która zawiera dykta, krotki i krotki krotek jako wartości i muszę porównać wersje zapisanych danych iw tym celu krotki są znacznie bardziej wygodne niż listy. Ale w JSON nie ma krotek (i myślisz też o żadnych datach?). – TNT
@Wooble: [ale ogólnie rzecz biorąc pikle powinny być zawsze preferowanym sposobem przekształcania do postaci szeregowej obiektów Pythona] (https://docs.python.org/3/library/pickle.html#comparison-with-marshal) –