@Derfirm
Noname Developer.

Как грамотно сохранять множество в питоне при выходе из программы?

Доброго времени суток, накидал небольшой фрагмент кода, суть которого добавлять при определённых условиях интовые значения в множество.
Скрипт может работать долгое время, хотелось бы иметь возможность сбросить в файл(?) текущие значения и продолжить с этого же места при следующем запуске.
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import random
from functools import wraps
import itertools
import sys

def cache_it(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except KeyboardInterrupt:
            str_set = ', '.join(map(lambda x: str(x), some_set))
            with open('cache.txt', 'wb+') as cachf:
                cachf.write(str_set)
            sys.exit()
    return wrapper

def foo(number):
    integer = random.randint(1, 1000)
    if number != integer:
        set_add(integer)
    print some_set
    time.sleep(random.randint(1, 2))

@cache_it
def do_something(number):
    print "do_something"
    foo(number)

if __name__ == "__main__":
    some_set = set()
    set_add = some_set.add
    for number in itertools.cycle([1,2,3,4]):
        do_something(number)
  • Вопрос задан
  • 3054 просмотра
Решения вопроса 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Самый простой путь - pickle. Единственный недостаток, плохая совместимость между версиями питона, это когда сохранились в одной версии, а восстанавливаем в другой.

import pickle

a=[]
fp = open("afile.bin")
pickle.dump(a,fp) #сохранить
a=pickle.load(fp) #восстановить
Ответ написан
Комментировать
@throughtheether
human after all
Можете воспользоваться модулем struct:
import random
import struct
>>> my_set={random.randint(1,1000) for _ in xrange(10)}
>>> my_set
set([246, 898, 918, 113, 11, 677, 82, 374, 184, 101])
data = struct.pack("I%dH" % len(my_set), len(my_set), *list(my_set))
>>> data
'\n\x00\x00\x00\xf6\x00\x82\x03\x96\x03q\x00\x0b\x00\xa5\x02R\x00v\x01\xb8\x00e\x00'


(data_len,)=struct.unpack("I", data[:struct.calcsize("I")])
>>> data_len
10

>>> reconstructed_set=set(struct.unpack("%dH" % data_len,data[struct.calcsize("I"):]))
>>> reconstructed_set
set([898, 246, 11, 113, 82, 918, 184, 374, 101, 677])
>>> reconstructed_set==my_set
True

В этом примере содержимое data можно, на мой взгляд, сохранять в файл, открытый для записи в двоичном режиме. Здесь представлена длина "массива", затем его составляющие.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы