Найти - Пользователи
Полная версия: Запись pickle
Начало » Python для экспертов » Запись pickle
1 2
felix
Написал небольшой скрипт

import pickle

input_file = open(“cache.txt”, “r”)
mydata = pickle.load(input_file)
input_file.close()

output_file = open(“dump.txt”, “w”)
p = pickle.Pickler(output_file)
p.dump(mydata)
output_file.close()

Т.е. он берет уже сохраненную бинарную информацию из файла cache.txt, восстанавливает ее и после чего производит запись в файл dump.txt .
Теперь вопрос. Как мне уже востановленый файл dump.txt прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.
pythonwin
как я понял задачу - тебе нужно только название файлов поменять
xonix
felix
Как мне уже востановленый файл dump.txt прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.
По-моему, ты путаешь. Оба файла содержат сериализованный объект mydata.
felix
Да, я действительно напутал. Записал я в файл вот таким образом

import pickle

input_file = open(“cache.txt”, “r”)
mydata = pickle.load(input_file)
input_file.close()

output_file = open(“dump.txt”, “w”)
output_file.write(str(mydata))
output_file.close()

Теперь мне нужно обратно вернуть в сериализованный вид. Как мне это сделать?
pythonwin
если mydata == объект класса, то обратно ты не переделаешь, а если список, кортеж или словарь. то это возможно
xonix
felix
Да, я действительно напутал. Записал я в файл вот таким образом
output_file.write(str(mydata))
А, ну так бы и говорил =). Лучше в таком случае использовать не str а repr, ибо repr обычно производит такую строку, ежели от которой взять eval, то получишь питоновскую структуру. Впрочем, pythonwin правильно заметил, это работает лишь для словарей, списков, кортежей (любой степени вложенности), заполненными примитивными данными (экземплярами типов - строками, числами, лонгами, комплексными, булеанами, но не объектами). К примеру:

>>> s = "{'a':[1, 2, 1+2j], False: (-123,)}"
>>> data = eval(s)
>>> data
{'a': [1, 2, (1+2j)], False: (-123,)}
>>> repr(data)
"{'a': [1, 2, (1+2j)], False: (-123,)}"
pythonwin
но при этом использование eval или exec может быть не безопасно:
>>> import sys
>>> eval('sys.exit(1)')
felix
Спасибо всем.
После того как я изменил str на repr и написал следующий скрипт

import pickle

input_file = open(“dump.txt”, “r”)
mydata = eval(input_file.read())
input_file.close()

output_file = open(“repr.txt”, “w”)
p = pickle.Pickler(output_file)
p.dump(mydata)
output_file.close()

И все заработало.
bialix
не открывайте файлы с бинарными данными в режиме ‘r’ и ‘w’ – на винде будете иметь гемор размером с кулак.
привыкайте пользовать ‘rb’, ‘wb’
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