Latest posts on Запись pickle topichttps://python.su/forum/topic/989/2007-07-11T20:20:39+03:00Общий :: Python для экспертов :: Запись pickle
2007-07-11T20:20:39+03:00Андрей Светлов6574А где в примере асинхронный файл? И что под этим подразумевается?<br/>Я всегда думал, что асинхронный файл делается переключением в nonblocking mode. Вариантов существует несколько…<br/>Получилось, потому что pickle protocol version 0. По умолчанию. Первая и вторая показали бы козью бяку.<br/>И вообще, совет использовать бинарные файлы очень хорош практически в любом случае.
Общий :: Python для экспертов :: Запись pickle
2007-07-11T19:24:51+03:00felix6572<strong>bialix</strong>, я в принципе под виндой это и запускал, но у меня все прекрасно заработало.<br/><br/>Зачем в данном случае использовать опции rb и wb? Разве асинхронные файлы являются бинарными?
Общий :: Python для экспертов :: Запись pickle
2007-07-10T23:42:47+03:00bialix6552не открывайте файлы с бинарными данными в режиме ‘r’ и ‘w’ – на винде будете иметь гемор размером с кулак.<br/>привыкайте пользовать ‘rb’, ‘wb’
Общий :: Python для экспертов :: Запись pickle
2007-07-10T17:24:19+03:00felix6543Спасибо всем.<br/>После того как я изменил str на repr и написал следующий скрипт <br/><br/>import pickle<br/><br/>input_file = open(“dump.txt”, “r”)<br/>mydata = eval(input_file.read())<br/>input_file.close()<br/><br/>output_file = open(“repr.txt”, “w”)<br/>p = pickle.Pickler(output_file)<br/>p.dump(mydata)<br/>output_file.close()<br/><br/>И все заработало.
Общий :: Python для экспертов :: Запись pickle
2007-07-10T17:05:50+03:00pythonwin6542но при этом использование eval или exec может быть не безопасно:<br/>>>> import sys<br/>>>> eval('sys.exit(1)')<br/>
Общий :: Python для экспертов :: Запись pickle
2007-07-10T16:56:19+03:00xonix6541<blockquote><em>felix</em><br/>Да, я действительно напутал. Записал я в файл вот таким образом<br/><div class="code"><pre><span class="n">output_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">mydata</span><span class="p">))</span>
</pre></div></blockquote>А, ну так бы и говорил =). Лучше в таком случае использовать не str а repr, ибо repr обычно производит такую строку, ежели от которой взять eval, то получишь питоновскую структуру. Впрочем, pythonwin правильно заметил, это работает лишь для словарей, списков, кортежей (любой степени вложенности), заполненными примитивными данными (экземплярами типов - строками, числами, лонгами, комплексными, булеанами, но не объектами). К примеру:<br/><br/><div class="code"><pre><span class="o">>>></span> <span class="n">s</span> <span class="o">=</span> <span class="s">"{'a':[1, 2, 1+2j], False: (-123,)}"</span>
<span class="o">>>></span> <span class="n">data</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">data</span>
<span class="p">{</span><span class="s">'a'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="mi">2j</span><span class="p">)],</span> <span class="bp">False</span><span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="mi">123</span><span class="p">,)}</span>
<span class="o">>>></span> <span class="nb">repr</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="s">"{'a': [1, 2, (1+2j)], False: (-123,)}"</span>
</pre></div>
Общий :: Python для экспертов :: Запись pickle
2007-07-10T16:18:13+03:00pythonwin6538если mydata == объект класса, то обратно ты не переделаешь, а если список, кортеж или словарь. то это возможно
Общий :: Python для экспертов :: Запись pickle
2007-07-10T15:41:46+03:00felix6537Да, я действительно напутал. Записал я в файл вот таким образом<br/><br/>import pickle<br/><br/>input_file = open(“cache.txt”, “r”)<br/>mydata = pickle.load(input_file)<br/>input_file.close()<br/><br/>output_file = open(“dump.txt”, “w”)<br/>output_file.write(str(mydata))<br/>output_file.close()<br/><br/>Теперь мне нужно обратно вернуть в сериализованный вид. Как мне это сделать?
Общий :: Python для экспертов :: Запись pickle
2007-07-10T14:45:32+03:00xonix6533<blockquote><em>felix</em><br/>Как мне уже востановленый файл dump.txt прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.</blockquote>По-моему, ты путаешь. Оба файла содержат сериализованный объект <strong>mydata</strong>.
Общий :: Python для экспертов :: Запись pickle
2007-07-10T12:35:15+03:00balu6528<a href="http://www.ibm.com/developerworks/ru/library/l-pypers/index.html">http://www.ibm.com/developerworks/ru/library/l-pypers/index.html</a>
Общий :: Python для экспертов :: Запись pickle
2007-07-10T11:58:45+03:00pythonwin6526как я понял задачу - тебе нужно только название файлов поменять
Общий :: Python для экспертов :: Запись pickle
2007-07-10T11:43:36+03:00felix6523Написал небольшой скрипт<br/><br/>import pickle<br/><br/>input_file = open(“cache.txt”, “r”)<br/>mydata = pickle.load(input_file)<br/>input_file.close()<br/><br/>output_file = open(“dump.txt”, “w”)<br/>p = pickle.Pickler(output_file)<br/>p.dump(mydata)<br/>output_file.close()<br/><br/>Т.е. он берет уже сохраненную бинарную информацию из файла cache.txt, восстанавливает ее и после чего производит запись в файл dump.txt .<br/>Теперь вопрос. Как мне уже востановленый файл dump.txt прочитать а затем опять превратить его в бинарный вид? Т.е. произвести те же действия только наоборот. Буду рад всякой информации.