Найти - Пользователи
Полная версия: "Файловая БД" не записывает в файл
Начало » Python для новичков » "Файловая БД" не записывает в файл
1 2
enjoy44
Доброго времени суток!
Не могу разобраться, почему если метод вызвать из другого, то он не работает, а если из экземпляра, то все прекрасно:
 class FoobarDB(object):
    def __init__(self , location):
        self.location = location 
        try: self.f = open(location,'r')
        except: self.f = open(location,'w')
        self.file.close()
    def set_db(self,key,value):
        with open(self.location,'r+') as self.file:
            self.data = self.file.read()
        if (self.data != ''):
            self.jsonData = json.loads(self.data)
            self.jsonData.update({key:value})
            self.jsonData = json.dumps(self.jsonData)
            self.file.write(self.jsonData)
            self.file.flush()
        else:
            self.jsonData = {key:value}
            self.jsonData = json.dumps(self.jsonData)
            self.file.write(self.jsonData)
            self.file.flush()
enjoy44
Во время отладки видно, что программа как-то пропускает
 self.file.write(self.jsonData)
Речь про метод set_db
doza_and
А чего вы хотите от операций с закрытым при выоде из with файлом?
enjoy44
Убрать self.file.close() не помогает Все равно если вызвать из экземпляра т.е. myDB.set_db() - то работает, а если откуда-нибудь из другого метода этого же класса self.set.db, то не работает.
FishHook
enjoy44
Вам говорят о том, что в строке
 with open(self.location,'r+') as self.file:
вы определяете некий контекст self.file, который по выходе из контекта, то есть по окончании оболасти видимости которую задает with, совершит некие финализирующие действия. Зачем нужен with? Затем, чтобы гарантировать выполнение неких действий с объектом в любых неблагоприятных условиях для освобождения ресурсов. Когда вы открываете файл в контексте with, он закроется по выходу из контекста. Поэтому дальнейшие ваши действия с ним за пределами with бессмысленны.
PEHDOM
enjoy44
Все равно если вызвать из экземпляра т.е. myDB.set_db() - то работает, а если откуда-нибудь из другого метода этого же класса self.set.db, то не работает.
я вообще не понимаю как оно у вас умудряеться работать, у вас self.file.write находиться вне with, оно должно вам I/O Error выдать.
enjoy44
PEHDOM
Я раньше получал сообщения об ошибках когда программировал в стандартной IDE, потом мне потребовалась отладка кода и я установил Visual Studio, там хоть и есть отладка, но бывает ошибки не выдает, просто программа закрывается и всё
enjoy44
     def set_db(self,key,value):
        with open(self.location,'r+') as self.file:
            self.data = self.file.read()
            if (self.data != ''):
                self.jsonData = json.loads(self.data)
                self.jsonData.update({key:value})
                self.jsonData = json.dumps(self.jsonData)
                self.file.write(self.jsonData)
                self.file.flush()
            else:
                self.jsonData = {key:value}
                self.jsonData = json.dumps(self.jsonData)
                self.file.write(self.jsonData)
                self.file.flush()

Если вот так:
 mydb = FoobarDB("mydb.db")
mydb.set_db('testoviy_key','testoviy_value')
то работает
Если так:
 #ТЕЛО МЕТОДА ЭТОГО КЛАССА
self.set_db('target',http)
                if not cookie and cookies:
                    self.set_db("login",base64.b64encode(str(cookies).replace("'", '"')))
#ПРОДОЛЖЕНИЕ МЕТОДА ЭТОГО КЛАССА
то не работает.
which поправил, если я все так понял

GIF - отладка
Your text to link here…
PEHDOM
enjoy44
GIF - отладка
это чтото новенькое, я такого еще не видел, можете запустить скрипт не из ВСкода, а просто из консоли, и выложить лог ошибки?
А вобщем сделайте вот так:
     def set_db(self,key,value):
        with open(self.location,'r+') as self.file:
            self.data = self.file.read()
            if (self.data != ''):
                self.jsonData = json.loads(self.data)
                self.jsonData.update({key:value})
                self.jsonData = json.dumps(self.jsonData)
                self.file.seek(0)
            else:
                self.jsonData = {key:value}
                self.jsonData = json.dumps(self.jsonData)
            self.file.write(self.jsonData)
            self.file.flush()
и должно все заработать
enjoy44
PEHDOM
Все равно не получается, в консоли тоже без ошибок
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB