Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Июль 10, 2007 11:43:36

felix
От:
Зарегистрирован: 2007-07-10
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

Написал небольшой скрипт

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 прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.



Офлайн

#2 Июль 10, 2007 11:58:45

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

как я понял задачу - тебе нужно только название файлов поменять



Офлайн

#3 Июль 10, 2007 12:35:15

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

#4 Июль 10, 2007 14:45:32

xonix
От:
Зарегистрирован: 2006-12-31
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

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



Отредактировано (Июль 10, 2007 14:46:03)

Офлайн

#5 Июль 10, 2007 15:41:46

felix
От:
Зарегистрирован: 2007-07-10
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

Да, я действительно напутал. Записал я в файл вот таким образом

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

Теперь мне нужно обратно вернуть в сериализованный вид. Как мне это сделать?



Офлайн

#6 Июль 10, 2007 16:18:13

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

если mydata == объект класса, то обратно ты не переделаешь, а если список, кортеж или словарь. то это возможно



Офлайн

#7 Июль 10, 2007 16:56:19

xonix
От:
Зарегистрирован: 2006-12-31
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

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,)}"



Офлайн

#8 Июль 10, 2007 17:05:50

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

но при этом использование eval или exec может быть не безопасно:
>>> import sys
>>> eval('sys.exit(1)')



Офлайн

#9 Июль 10, 2007 17:24:19

felix
От:
Зарегистрирован: 2007-07-10
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись pickle

Спасибо всем.
После того как я изменил 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()

И все заработало.



Офлайн

#10 Июль 10, 2007 23:42:47

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Запись pickle

не открывайте файлы с бинарными данными в режиме ‘r’ и ‘w’ – на винде будете иметь гемор размером с кулак.
привыкайте пользовать ‘rb’, ‘wb’



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version