2014-02-03 2 views
-1

Интересно, что было бы хорошим выбором для хранения двоичных данных в файле на диске. Отлично, если бы это был встроенный модуль Python, так как я хотел бы сохранить все это. Случайный доступ к письменным данным может быть плюсом, но это не требуется. Для этой реализации я бы предпочел простоту и скорость. Что я ищу: сохранить его сейчас - получить его позже. Заранее спасибо!Python Сохранение двоичных данных в файле на диске

EDITED:

Нашли проблему, почему cPickle был erroring вне. В одном из классов я объявил self.os = os И появляется self.os - это не то, что нравится cPickle ... Несколько позже я обнаружил, что cPickle не принимает объекты PyQT, если они (экземпляры класса PyQT) указаны как атрибуты класса (в случае, если вы выгружаете список экземпляров some_class).

Пример ниже, если запустить повторяет ту же ошибку:

import cPickle 
import os 

class MyClass(object): 
    """docstring for MyClass""" 
    def __init__(self, arg): 
     super(MyClass, self).__init__() 
     self.arg = arg 
     self.os=os   

data=MyClass("Hello World")  

file_name='dampData.data' 

out_file = open(file_name, 'wb') 
cPickle.dump(data, out_file) 
out_file.close() 

ответ

3

Я бы рекомендовал cPickle - он также встроен и значительно быстрее, чем рассол (в большинстве случаев).

пример:

import cPickle 

out_file = open(file_name, 'w') 
cPickle.dump(data, out_file) 
out_file.close() 

in_file = open(file_name, 'r') 
data = cPickle.load(in_file) 
in_file .close() 

Из официальной документации рассола:

The pickle module has an optimized cousin called the cPickle module. As its name implies, cPickle is written in C, so it can be up to 1000 times faster than pickle.

+0

В то время как демпфирование двоичных данных (который является экземпляром класса) cPickle дает эту ошибку: raise TypeError, «не может определять количество объектов% s».% Base .__ name__ TypeError: не может определять объекты модуля – alphanumeric

+0

Какой класс вы демпинговы ? Вы пробовали: out_file = open (имя_файла, 'wb') in_file = open (имя_файла, 'rb') ? – zvisofer

+0

Ive jist попробовал флаг «wb» вместо «w» во время записи в файл.К сожалению, это не решило проблему. cPickle отказывается сбрасывать. Мне удалось сделать дамп простой строковой переменной. Я открыл файл дампа, сделанный cPickle, и его содержимое оказалось читаемым человеком. Вы уверены, что cPickle работает с двоичной формой? – alphanumeric

1

Посмотрите на pickle и shelve модулей!

+0

рассол жалуется, что не может сбросить объект экземпляра TypeError методы класса: объекты не могут модуль рассол – alphanumeric

+0

@Sputnix кажется, что вы засолки модуль рассол сам каким-то образом, http://stackoverflow.com/questions/ 2790828/python-cant-pickle-module-objects-error – ndpu

+0

См. Ответ, который я приложил к оригинальной публикации. – alphanumeric

0

Вы можете использовать обычные функции питона для чтения/записи двоичного файла. Добавьте «B» в режим, если на Windows:

f = open('workfile', 'wb') # opens a file for writing in binary mode 

Если вы используете Python 3, то вам, возможно, придется сделать немного больше работы со строковыми кодировок.

Смежные вопросы