Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 26, 2012 12:41:34

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

запись членов класса в файл

Здравствуйте, есть класс имеющий переменные, списки и строки произвольной длины. Как лучше\проще\красивее реализовать запись членов(не всех) объкта такого класса в файл с возможностью дозаписи в конец этого файла. При чтение нужно получить список из объектов класса. Количество объектов большое, объем наверно будет в диапазоне десятков ГБ, то есть важно указать размер переменных. В pickle ни указание размера ни дозапись ни кастомизацию членов у меня реализовать не получается, да и не подходит он наверное для файлов таких размеров. Знаю как сделать через struct, но там выйдет в много строк.

Офлайн

#2 Июнь 26, 2012 13:22:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

запись членов класса в файл

sergeek
объем наверно будет в диапазоне десятков ГБ
И все это в один файл?
А почему не в БД?



Офлайн

#3 Июнь 26, 2012 13:59:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

запись членов класса в файл

import sqlite3, os
def serializable(cls):
  class Wrapper(object):
    SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
    DB_PATH = os.path.join(SITE_ROOT, 'db.sqlite')
    
    def serialize(self):
      conn = sqlite3.connect(self.DB_PATH)
      cursor = conn.cursor()
      for attr in self.instance.TOBD:
	cursor.execute('INSERT INTO store VALUES (?,?,?)', [attr, str(getattr(self.instance,attr)), str(self.wrapped)])
	
      conn.commit()
      cursor.close()
    
    def __init__(self):
      if not hasattr(cls, 'TOBD'):
	cls.TOBD=[]
      setattr(cls, 'serialize', self.serialize)
      self.wrapped=cls
      
    def __call__(self, *args, **kw):
      self.instance=self.wrapped(*args, **kw)
      return self.instance
  return Wrapper()
  
@serializable      
class  Foo():
  TOBD=['a','b']
  def __init__(self):
    self.a=5
    self.b=[1,2,3]
    
f=Foo()
f.serialize()
b=Foo()
b.a="sdfsdf"
b.serialize()



Офлайн

#4 Июнь 26, 2012 16:40:31

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

запись членов класса в файл

FishHook
sergeek
объем наверно будет в диапазоне десятков ГБ
И все это в один файл?
А почему не в БД?
Около 10-20 файлов, их имена присутствуют в этом же классе. БД при беглом обзоре показались для задач гораздо сложнее моей, поэтому я еще не начинал изучать их
FishHook

Ваш код, кажется, то что нужно, только у меня выдает ошибку:

Traceback (most recent call last):
File “/home/sergeek/Projects/ffffff/db.py”, line 35, in <module>
f.serialize()
File “/home/sergeek/Projects/ffffff/db.py”, line 11, in serialize
cursor.execute('INSERT INTO store VALUES (?,?,?)', )
sqlite3.OperationalError: no such table: store

А он будет записывать списки состоящие из чисел от 1 до 8 в 1 байт?
спасибо

Почитал, нужно создать сначало этот table, там же и указывается тип, в общем надо разбираться…

Отредактировано sergeek (Июнь 26, 2012 20:32:41)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version