Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 3, 2014 20:32:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как делать защиту от ошибок во время записи в файл?

Задача - хранить в файле изменяемые данные. Файл типа json те надо переписывать полностью. Но данные отдают все подряд, могут подсунуть гадость для записи. Как не потерять данные которые были накоплены ранее? Не нашел красивого готового решения, налепил велосипед…:( Самому он противен.

import json
class safe_open:
    u"""backup file then open for write, restore old version in the case of unhandled exceptions"""
    def __init__(self, name,fun,*args):
        self.name=name
        self.bak=self.name+".bak"
        self.fun=fun
        self.args=args
    def __enter__(self):
        if os.path.exists(self.bak):
            os.remove(self.bak)
        if os.path.exists(self.name):
            os.rename(self.name,self.bak)
        self.f=self.fun(self.name,*self.args)
        return self.f
    def __exit__(self, exc_type, exc_value, traceback):
        self.f.close()
        if not exc_type is None:
            if os.path.exists(self.bak):
                os.remove(self.name)
                os.rename(self.bak,self.name)
with safe_open("aaa.json",open,"wb") as f:
    json.dump(safe_open,f)



Отредактировано doza_and (Ноя. 3, 2014 20:35:42)

Офлайн

#2 Ноя. 3, 2014 23:05:11

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Как делать защиту от ошибок во время записи в файл?

Не по теме, но осмелюсь написать.

if not exc_type is None: --> if exc_type is not None:
режет глаз.

Офлайн

#3 Ноя. 4, 2014 02:46:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Как делать защиту от ошибок во время записи в файл?

Возьми io.StringIO, выполни туда запись, а потом уже из него в файл.

>>> import json
>>> import io
>>> 
>>> s = io.StringIO('start')
>>> s.read()
'start'
>>> json.dump([1, 2, 3], s)
>>> json.dump([1, 2, 3], s)
>>> s.seek(0)
0
>>> s.read()
'start[1, 2, 3][1, 2, 3]'
>>>



Отредактировано py.user.next (Ноя. 4, 2014 02:50:40)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version