Найти - Пользователи
Полная версия: Модуль pickle
Начало » Python для новичков » Модуль pickle
1
SomethingButNotNickName
Добрый день.
Есть некий словарь. Задача записать его в файл.
 
import pickle
data ={'key1': 'item1',
'key2': 'item2',
'key3': 'item3',
'key4': 'item4',
'key5': 'item5'}
with open('data.txt', 'wb') as f:
pickle.dump(data, f)
В результате создается текстовый файл data.txt внутри которого байтовое представление моего исходного словаря (поправьте если не прав). Если читать этот файл питоном все хорошо, но без питона - проблема. Я открываю этот файл SublimeText'ом - вижу строки байтов. Если открыть блокнотом, то он (блокнот) по видимому пытается перевести мой файл в юникод и терпит неудачу (см скрин). Есть возможность создать файл так, чтобы его потом можно было открыть и текстовым редактором и увидеть исходный словарь. Ну или хотя бы строку вида:
 {'key1': 'item1', 'key2': 'item2', 'key3': 'item3', 'key4': 'item4', 'key5': 'item5'} 
Rodegast
Сохраняй словарь как json, это можно сделать например при помощи модуля simplejson
SomethingButNotNickName
Спасибо
SomethingButNotNickName
import simplejson as json
data ={'key1': 'item1',
'key2': 'item2',
'key3': 'item3',
'key4': 'item4',
'key5': 'item5',
'ключ': 'итем'}

with open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, sort_keys=True, indent=4))
Кириллические символы в создаваемом файле в виде
"\u043a\u043b\u044e\u0447": "\u0438\u0442\u0435\u043c" 
Как поправить?

PS: насколько я понимаю simplejson дублирует как минимум часть функций и методов стандартного json. Разница между ними есть? Ну, например, то же .dumps() есть и там и там.
spikejke
SomethingButNotNickName
Добрый день.Есть некий словарь. Задача записать его в файл.
Попробуйте добавить аргумент protocol=0
Protocol version 0 is the original “human-readable” protocol and is backwards compatible with earlier versions of Python.
 import pickle
data ={'key1': 'item1',
       'key2': 'item2',
       'key3': 'item3',
       'key4': 'item4',
       'key5': 'item5'}
with open('data.txt', 'w') as f:
    pickle.dump(data, f, protocol=0)
Сам не пробовал , смущает строчка backwards compatible with earlier versions of Python )
SomethingButNotNickName
spikejke
Будет строка из латинских символов и цифр.
 (dp0Vkey1p1Vitem1p2sVkey2p3Vitem2 и так далее
С исходным словарем сходство есть, но слишком далекое
Насчет protocol=0 - указание на используемую версию змеи. “backwards compatible with earlier versions of Python” - возвращает совместимость с ранними версиями Python, насколько я понимаю
doza_and
SomethingButNotNickName
С исходным словарем сходство есть, но слишком далекое
Я не знаю чем simplejson лучше чем входящий в стандартную поставку json

https://docs.python.org/3/library/json.html

По последнему обратите внимание на ключик ensure_ascii=True, который можно сделать false Ну и открывать файл надо с encoding=“utf-8”.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB