Уведомления

Группа в Telegram: @pythonsu

#1 Март 31, 2020 03:11:34

enjoy44
Зарегистрирован: 2018-04-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

Доброго времени суток!
Не могу разобраться, почему если метод вызвать из другого, то он не работает, а если из экземпляра, то все прекрасно:

 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()

Офлайн

#2 Март 31, 2020 03:14:40

enjoy44
Зарегистрирован: 2018-04-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

Во время отладки видно, что программа как-то пропускает

 self.file.write(self.jsonData)
Речь про метод set_db

Отредактировано enjoy44 (Март 31, 2020 03:27:54)

Офлайн

#3 Март 31, 2020 07:14:11

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

"Файловая БД" не записывает в файл

А чего вы хотите от операций с закрытым при выоде из with файлом?



Отредактировано doza_and (Март 31, 2020 07:15:07)

Офлайн

#4 Март 31, 2020 11:59:06

enjoy44
Зарегистрирован: 2018-04-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

Убрать self.file.close() не помогает Все равно если вызвать из экземпляра т.е. myDB.set_db() - то работает, а если откуда-нибудь из другого метода этого же класса self.set.db, то не работает.

Отредактировано enjoy44 (Март 31, 2020 12:04:50)

Офлайн

#5 Март 31, 2020 12:32:14

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

"Файловая БД" не записывает в файл

enjoy44
Вам говорят о том, что в строке

 with open(self.location,'r+') as self.file:
вы определяете некий контекст self.file, который по выходе из контекта, то есть по окончании оболасти видимости которую задает with, совершит некие финализирующие действия. Зачем нужен with? Затем, чтобы гарантировать выполнение неких действий с объектом в любых неблагоприятных условиях для освобождения ресурсов. Когда вы открываете файл в контексте with, он закроется по выходу из контекста. Поэтому дальнейшие ваши действия с ним за пределами with бессмысленны.



Офлайн

#6 Март 31, 2020 12:42:53

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

enjoy44
Все равно если вызвать из экземпляра т.е. myDB.set_db() - то работает, а если откуда-нибудь из другого метода этого же класса self.set.db, то не работает.
я вообще не понимаю как оно у вас умудряеться работать, у вас self.file.write находиться вне with, оно должно вам I/O Error выдать.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Март 31, 2020 13:16:57

enjoy44
Зарегистрирован: 2018-04-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

PEHDOM
Я раньше получал сообщения об ошибках когда программировал в стандартной IDE, потом мне потребовалась отладка кода и я установил Visual Studio, там хоть и есть отладка, но бывает ошибки не выдает, просто программа закрывается и всё

Офлайн

#8 Март 31, 2020 13:31:01

enjoy44
Зарегистрирован: 2018-04-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

     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…

Отредактировано enjoy44 (Март 31, 2020 13:41:02)

Офлайн

#9 Март 31, 2020 16:22:54

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

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()
и должно все заработать



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Март 31, 2020 17:13:19

enjoy44
Зарегистрирован: 2018-04-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

"Файловая БД" не записывает в файл

PEHDOM
Все равно не получается, в консоли тоже без ошибок

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version