Форум сайта python.su
Написал небольшой скрипт
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 прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.
Офлайн
как я понял задачу - тебе нужно только название файлов поменять
Офлайн
Офлайн
felixПо-моему, ты путаешь. Оба файла содержат сериализованный объект mydata.
Как мне уже востановленый файл dump.txt прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.
Отредактировано (Июль 10, 2007 14:46:03)
Офлайн
Да, я действительно напутал. Записал я в файл вот таким образом
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()
Теперь мне нужно обратно вернуть в сериализованный вид. Как мне это сделать?
Офлайн
если mydata == объект класса, то обратно ты не переделаешь, а если список, кортеж или словарь. то это возможно
Офлайн
felixА, ну так бы и говорил =). Лучше в таком случае использовать не str а repr, ибо repr обычно производит такую строку, ежели от которой взять eval, то получишь питоновскую структуру. Впрочем, pythonwin правильно заметил, это работает лишь для словарей, списков, кортежей (любой степени вложенности), заполненными примитивными данными (экземплярами типов - строками, числами, лонгами, комплексными, булеанами, но не объектами). К примеру:
Да, я действительно напутал. Записал я в файл вот таким образомoutput_file.write(str(mydata))
>>> 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,)}"
Офлайн
но при этом использование eval или exec может быть не безопасно:
>>> import sys
>>> eval('sys.exit(1)')
Офлайн
Спасибо всем.
После того как я изменил 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()
И все заработало.
Офлайн
не открывайте файлы с бинарными данными в режиме ‘r’ и ‘w’ – на винде будете иметь гемор размером с кулак.
привыкайте пользовать ‘rb’, ‘wb’
Офлайн