Меняется значение списка

здравствуйте!написал достаточно большой код для того что бы помощью 1 класса можно было сохранять и читать словари из текстового файла, этакий ПЗУ ,поскольку готового не нашел, вот сам код моего класса :

class dataBase :
    def __init__ (self,base_name):
        self.base_name=str(base_name)
    def read (self):
        base = open(str(self.base_name), 'r')
        base_r = base.read()
        st1 = ''
        dict_r = ''
        dict_r = {}
        trash = 0
        for i in base_r:
            # print ('i:',i)
            if i == ' ' or i == '\n':
                continue
            if not trash:
                if not i == ':':
                    st1 += i
                else:
                    trash = 1
            else:
                dict_r[st1] = i
                st1 = ''
                trash = 0
        print('resulr READING - ', dict_r)
        print ('base_name - ',str(self.base_name))
        global stick
        if str(self.base_name) == "dataSti.txt" :
            print ('obnov stick!!!!!')
            stick = dict_r
        base.close()
        return dict_r
    def write (self,id,val):
        self.id = id
        self.val=val
        print('write id - ',self.id)
        print('write val - ', self.val,type(self.val))
        data1 = dataBase (str(self.base_name))
        base_r = data1.read ()
        if str(self.id) in base_r:
            # изменяем имеюoийся айди
            base = open(str(self.base_name), 'r')
            base_r = base.read()
            base.close
            #print('change')
            tc = ''
            dict_r = ''
            trash=0
            for i in base_r:
                if trash == 0 :
                   if i == ' 'or i == '\n':
                       continue
                   if not i == ':':
                       tc+=i
                   else :
                       trash = 1
                       continue
                else :
                    if i == ' ' or i == '\n':
                        continue
                    print ('tc - ',tc ,'val - ',str(self.val))
                    if str(tc) == str(self.id):
                        dict_r +=  tc + ' : ' + str(self.val) + '\n'
                        trash = 0
                        tc = ''
                        print (i)
                        print ('FOUnD!!!!!!!')
                    else :
                        dict_r +=   tc + ' : ' + i +'\n'
                        trash = 0
                        tc = ''
                        print ('OLD!!!')
                print (dict_r)
            base = open(str(self.base_name), 'w')
            base.write(base_r)
            del (base_r)
            base.close()
        else:
            # добаляем айди
            base = open('dataSti.txt', 'a+')
            base_r = base.read()
            newT = base_r + '\n' +str(id) + ' : ' + str(val)
            base.write(newT)
            base.close()

собственно тут все сложно, поэтому обьясню .метод read() рабочий и его мы не трогаем ,а метод write ,должен добавлять или же изменять пуyкты словаря (id эт то ,что до : ,а val это то, что позже) первым if он поверяет есть ли в файле пункт id и если нет - успешно добавляет новый, но если есть - он читает файл в for по одному символу перезаписывает все пункты ,но если пункт совпадает с нашим пунктом (id)то меняет в строках

                    if str(tc) == str(self.id):
                        dict_r +=  tc + ' : ' + str(self.val) + '\n'
                        trash = 0
                        tc = ''
                        print (i)
                        print ('FOUnD!!!!!!!')

меняет значение( то что после : ) на val и если выводить в консоль - мы видим следующее:
зачение удачно записывается,но как только начинается запись в сам файл следующего пункта - значение меняется на прошлое (в данном случае айди это пункт начинающийся с 905), а если он был последним - тоже самое ,каждая строчка это 1 проход по символу файла , а после пробела запись новoго блока из base_r
прошу прощение за смазывание

!

Так если всё сложно, то надо попробовать для начала сделать проще :kolobokbatya:

Например, читать не по символам, а построчно через readlines и разделять через split.

А при записи не читать снова словарь, а просто перезаписывать весь файл новым содержимым.
Ну или если нужно чтение (например, если write может быть вызван до read), то не дублировать код, а просто вызвать свой read и получить словарь, сделать с ним, что надо, перезаписать весь файл.

нам надо перебирать пункты для нахождения нужного для изменения, а если читать по строкам - надо как-то строку разделить на до : и после

parts = line.split(':')

хороший вариант , но хочется все таки узнать где здесь ошибка

Так тут сложно разбираться :boredparrot:

Зачем? Тут же всё равно читается весь файл в начале

так что если там сотни мегабайт/гигабайт, то поиск во время разбора содержимого файла всё равно не особо поможет )

А если файл маленький, то проще не париться, прочитать словарь уже готовой функцией, найти в нем что надо, потом перезаписать весь файл.

к сожалению хранится все как строка и записать это как массив или словарь нельзя, поэтому мне нужно каждую строку сверять
а за split спасибо ! не знал…

Это причем? :thinking:

Я о том, что можно как-то так:

data = self.read()

data[id] = val

# запись всех элементов data в файл
...

Так получится не то, что задумано, если ищем 234, а в файле есть 12345.

у меня файл выглядит так :
654324 : 1
654334 : 0
104792 : 1
а даже если бы я хранил как список, то получил бы строку

хотя если вы имеете ввиду прочитать моей функцией - да
все! до меня дошло, спасибо!