Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
108 / 103 / 18
Регистрация: 05.08.2021
Сообщений: 487

А я вот тут базу данных сварганил без самой "базы данных", т. е. без SQL

16.08.2025, 15:56. Показов 2775. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Конечно понимаю что должен быть бит за это тапком ибо на большом объеме данных работать будет с чудовищной медленностью, но тем не менее...
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
from tkinter import *
from itertools import groupby
 
 
try:
    class Person:
        instances = []
        data_from_entries = ''
        search = ''
        save = ''
 
        def __init__(self, name, surname, sex, age, number, location):
            self.name = name
            self.surname = surname
            self.sex = sex
            self.age = age
            self.number = number
            self.location = location
            self.instances.append(self)
 
        @staticmethod
        def create_file():
            file = open('objects.txt', 'w')
            file.close()
 
        @staticmethod
        def create_removed():
            file = open('removed.txt','w')
            file.close()
 
        @staticmethod
        def output(a, b):
            inp = Person.search
            a.config(text=Person.search)
            test = False
            pass_name = set()
            persons = ''
            for i in Person.instances:
                if i.surname.strip() == inp.strip():
                    test = True
                    if i.name not in pass_name:
                        persons += f'имя:         {i.name}\nпол:         {i.sex}\nвозраст:  {i.age} \nномер:    {i.number} \nадрес:      {i.location}\n_____________________________________________________\n'
                pass_name.add(i.name)
            if test:
                b.config(text=persons)
            else:
                b.config(text='Фамилия не найдена')
 
        @staticmethod
        def append_obj_to_file():
            with open('objects.txt', 'a+', encoding='utf-8') as file:
                data = Person.data_from_entries
                # print(data)
                s = file.read()
                if data.count('не указано') < 6:
                    file.write(data + '|')
                    file.seek(0)
 
        @staticmethod
        def test_file_for_valid_format(n):
            def test_string_has_right_format(x):
                return not bool(len(x.split('|')[:-1]) % 6) and '|' in x
 
            with open(n, encoding='utf-8') as file:
                s = file.read()
                if s:
                    if s[-1] != '|':
                        s += '|'
                    if test_string_has_right_format(s):
                        return s
                    if s[-1] != '|':
                        s += '|'
                    new_n = []
                    for i in range(len(s) - 1):
                        if s[i] != '|' or (s[i] == '|' and s[i - 1] != '|'):
                            new_n += s[i]
                    new_s = ''.join(new_n)
                    if new_s[-1] != '|':
                        new_s += s[-1]
                    if new_s[-1] != '|':
                        new_s += '|'
                    s = new_s
                    n = s.split('|')
                    r = len(n[:-1])
                    if not r % 6 == 0:
                        i = r
                        while i % 6:
                            i += 1
                        res = i - r
                        for i in range(res):
                            s += 'не указано|'
                else:
                    Person.save = ''
                    # print('file is empty')
                return s
 
        @staticmethod
        def change_file_for_valid(x):
            with open(x, 'w', encoding='utf-8') as file:
                file.write(Person.save)
 
        @staticmethod
        def read_db():
            Person.save = Person.test_file_for_valid_format('objects.txt')
            Person.change_file_for_valid('objects.txt')
            with open('objects.txt', encoding='utf-8') as file:
                s = file.read().strip().split('|')
                res = []
                for i in range(0, len(s) - 5, 6):
                    res += [s[i: i + 6]]
                return res
 
        @staticmethod
        def create_objects():
            Person.instances.clear()
            s = Person.read_db()
            for i in s:
                obj = Person(*i)
 
        @staticmethod
        def draw_gui():
            root = Tk()
            root.geometry('600x650+200+100')
            root.title('Alexander`s Notebook 1.1')
            root.iconbitmap('favicon.ico')
            root.configure(bg='beige')
 
            def change_spaces(s):
                s = s.replace('|', '/')
                return s
 
            def test_button():
                result = [e1.get(), e2.get(), e3.get(), e4.get(), e5.get(), e6.get()]
                result2 = list(map(lambda x: 'не указано' if x == '' else x, result))
                for i in range(len(result2)):
                    result2[i] = change_spaces(result2[i])
                Person.data_from_entries = '|'.join(result2)
                e1.delete(0, END)
                e2.delete(0, END)
                e3.delete(0, END)
                e4.delete(0, END)
                e5.delete(0, END)
                e6.delete(0, END)
 
                Person.append_obj_to_file()
                Person.create_objects()
 
            def search_name():
                try:
                    label7.config(foreground='green', justify='center', font=('verdana', 20))
                    try:
                        Person.create_objects()
                        Person.search = e7.get()
                        Person.output(label7, label8)
                        e7.delete(0, END)
                    except IndexError:
                        label7.config(text='ошибка ввода')
                        with open('objects.txt', 'w', encoding='utf-8') as file:
                            file.write(Person.save)
                    except FileNotFoundError:
                        label7.config(text='Для создания файла с данными \nвведите первый контакт')
                        Person.create_file()
                except:
                    label7.config(text='Что-то пошло не так \nПерезапустите программу')
                    label8.config(text='')
 
            def to_del_contact():
                x = e9.get()
                with open('objects.txt', encoding='utf-8') as file:
                    s = file.read()
                if x in s:
                    n = s.split('|')
                    indexes = []
                    deleted = []
                    for i, f in enumerate(n):
                        if f == x:
                            indexes += [i]
                    for i in indexes:
                        if n[i - 1] == e8.get():
                            deleted = n[i - 1: i + 5]
                            break
                    to_removed = '|'.join(deleted) + '|'
                    del n[i - 1:i + 5]
                    s = '|'.join(n)
                    with open('removed.txt', 'a', encoding='utf-8') as file:
                        file.write(to_removed)
                    with open('objects.txt', 'w', encoding='utf-8') as file:
                        file.write(s)
                e8.delete(0, END)
                e9.delete(0, END)
 
            def show_contacts():
                try:
                    # сортировка по фамилиям
                    with open('objects.txt', encoding='utf-8') as file:
                        s = file.read()
                    ns = s.split('|')[:-1]
                    res = []
                    for i in range(0, len(ns) - 5, 6):
                        res += [ns[i: i + 6]]
                    res.sort(key=lambda x: x[1])
                    # сортировка однофамильцев по именам
                    result = []
 
                    def grouper(item):
                        return item[1]
 
                    for key, group_items in groupby(res, key=grouper):
                        b = list(group_items)
                        b.sort(key=lambda x: x[0])
                        b = sum(b, [])
                        result.append(b)
                    result = sum(result, [])
                    s = '|'.join(result) + '|'
                    with open('objects.txt', 'w', encoding='utf-8') as file:
                        file.write(s)
                    # сортировка по фамилиям
                    Person.create_objects()
                    label7.config(foreground='blue', justify='left')
                    contacts = ''
                    if not Person.instances:
                        label7.config(text='База контактов пуста')
                    else:
                        for i in Person.instances:
                            contacts += f'{i.surname} {i.name}\n'
                        label7.config(text=contacts, font=('verdana', 10))
                        label8.config(text='')
                except:
                    label7.config(text='')
                    label8.config(text='Что-то пошло не так \nПерезапустите программу')
 
            def restore_contacts():
                Person.save = Person.test_file_for_valid_format('removed.txt')
                Person.change_file_for_valid('removed.txt')
                s = ''
                with open('removed.txt', encoding='utf-8') as file1:
                    s = file1.read()
                # print(s)
                with open('objects.txt', 'a', encoding='utf-8') as file2:
                    file2.write(s)
                with open('removed.txt', 'w', encoding='utf-8') as file3:
                    file3.write('')
 
            label1 = Label(text='Имя', bg='beige', font=('verdana', 10))
            e1 = Entry(width=40)
            label2 = Label(text='Фамилия', bg='beige', font=('verdana', 10))
            e2 = Entry(width=40)
            label3 = Label(text='Пол', bg='beige', font=('verdana', 10))
            e3 = Entry(width=40)
            label4 = Label(text='Возраст', bg='beige', font=('verdana', 10))
            e4 = Entry(width=40)
            label5 = Label(text='Номер', bg='beige', font=('verdana', 10))
            e5 = Entry(width=40)
            label6 = Label(text='Адрес', bg='beige', font=('verdana', 10))
            e6 = Entry(width=40)
            button = Button(text='Добавить контакт', foreground='red', command=test_button)
            e7 = Entry(width=40)
            button2 = Button(text='Искомая фамилия', foreground='green', command=search_name)
            label7 = Label(text='Результат поиска', foreground='red', bg='beige', font=('verdana', 10))
            label8 = Label(justify=LEFT, bg='beige')
            label9 = Label(text="Удаление контактов", bg='beige', font=('verdana', 10))
            e8 = Entry(width=40)
            button3 = Button(text='Удалить контакт', command=to_del_contact)
            label10 = Label(text="Имя", bg='beige', font=('verdana', 10))
            label11 = Label(text="Фамилия", bg='beige', font=('verdana', 10))
            e9 = Entry(width=40)
            button5 = Button(text='Показать контакты', command=show_contacts)
            button4 = Button(text='Восстановить', command=restore_contacts)
 
            label1.place(x=120, y=10)
            e1.place(x=20, y=30)
            label2.place(x=105, y=50)
            e2.place(x=20, y=70)
            label3.place(x=120, y=90)
            e3.place(x=20, y=110)
            label4.place(x=110, y=130)
            e4.place(x=20, y=150)
            label5.place(x=115, y=170)
            e5.place(x=20, y=190)
            label6.place(x=115, y=210)
            e6.place(x=20, y=230)
            button.place(x=85, y=260)
            e7.place(x=20, y=300)
            button2.place(x=85, y=330)
            label7.place(x=320, y=10)
            label8.place(x=300, y=50)
            label9.place(x=85, y=360)
            label10.place(x=120, y=380)
            e8.place(x=20, y=405)
            label11.place(x=105, y=425)
            e9.place(x=20, y=445)
            button3.place(x=85, y=475)
            button4.place(x=90, y=510)
            button5.place(x=78, y=565)
 
            e1.focus()
 
            root.mainloop()
 
except FileNotFoundError:
    Person.create_file()
    Person.create_removed()
finally:
    Person.draw_gui()
Миниатюры
А я вот тут базу данных сварганил без самой "базы данных", т. е. без SQL  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2025, 15:56
Ответы с готовыми решениями:

Вот такая вот задача
Здравствуйте, помогите решить, пожалуйста Охранниками магазина работают Андреев, Иванов, Петров,...

Что означают все эти данные вот в этом коде PITHON и где можно найти описание всех этих данных в коде
#!/usr/bin/python # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford...

Тут по теме выше про "Тест" написал функцию и вот хочу понять как МОДЕРНИЗИРОВАТЬ её, обернуть в @декоратор?
Вот он # coding: utf8 __author__ = 'yesok' def m(): print(&quot;End!&quot;) def main():

17
108 / 103 / 18
Регистрация: 05.08.2021
Сообщений: 487
16.08.2025, 16:22  [ТС]
Недочет разве что в except FileNotFoundError. В курсе что там далеко не всегда получается именно то что я хотел... И причину знаю. Но задача чисто учебная, так что и взятки гладки
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
23.09.2025, 10:04
Почему ты называешь это "базой данных" и сравниваешь с SQL? Лично я вижу просто оболочку графическую для работы с жестко структурированным текстовым файлом.
Тем кто не делает логгирование нужно сразу отрубать руки.
0
2895 / 1930 / 208
Регистрация: 05.06.2011
Сообщений: 5,674
23.09.2025, 13:05
Ну, таки он называет это базой данных потому что это именно она и есть. Да, простенькая, маломощная и т.п. — но это вполне себе она, база данных.
0
108 / 103 / 18
Регистрация: 05.08.2021
Сообщений: 487
23.09.2025, 13:26  [ТС]
Цитата Сообщение от ViachaslauK Посмотреть сообщение
Почему ты называешь это "базой данных"
Потому что сохраняет введенные данные. И даже выводит их по запросам в более-менее удобоваримом виде.
SQL просто на тот момент еще не начал штудировать
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
23.09.2025, 13:46
Цитата Сообщение от iifat Посмотреть сообщение
Ну, таки он называет это базой данных потому что это именно она и есть. Да, простенькая, маломощная и т.п. — но это вполне себе она, база данных.
Тогда любок документ в txt, doc формате - тоже себе база данных. Данные есть? есть, хранятся? Хранятся.
Я не просто так спросил про SQL.
А если отойти от этого - база данных подразумевает хранение данных в формате, позволяющем легко организовать выборки данных, быстрый доступ, сортировку.
Что мы имеем в данном случае? Перебор текстового файла и парсинг, без возможности доступа к элементу.
Мне сложно считать это базой данных.
0
108 / 103 / 18
Регистрация: 05.08.2021
Сообщений: 487
23.09.2025, 13:50  [ТС]
Цитата Сообщение от ViachaslauK Посмотреть сообщение
Мне сложно считать это базой данных
Ну ладно, пусть не "база данных" Но то что хотя бы "записная книжка" уж точно.
Сортировка кстати есть там у меня. И не только по фамилиям, но и по именам однофамильцев. Над этим даже пришлось поломать голову
0
2895 / 1930 / 208
Регистрация: 05.06.2011
Сообщений: 5,674
23.09.2025, 14:11
Цитата Сообщение от ViachaslauK Посмотреть сообщение
А если отойти от этого - база данных подразумевает хранение данных в формате, позволяющем легко организовать выборки данных, быстрый доступ, сортировку.
«Не служил — не мужик»
«На Эверест не сходил — не альпинист»
«Меньше терабайта — не база данных»
Вкусовщина. Прекрасный пример выбора средств хранения данных, адекватного поставленной задаче. Наоборот — куда хуже, имхо: еслиб та ж программа, а данные хранить непременно в Оракле.
2
364 / 328 / 83
Регистрация: 17.04.2022
Сообщений: 1,070
Записей в блоге: 8
23.09.2025, 14:24
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Но то что хотя бы "записная книжка" уж точно.

Не по теме:

Пара слов. Неважно как вы это называете, важно, что вам это нравится делать! Это главное. Умение подбирать правильные слова придет позже.

0
-610 / 35 / 0
Регистрация: 10.03.2025
Сообщений: 485
23.09.2025, 15:18
Тапком тут можно схлопотать за просто так, чтоб жизнь малиной не казалась.

А базой данных можно назвать любой набор данных, содержащий
регулярную инфу в виде столбиков и строк, сиречь полей и записей
сколько раз в жизни приходилось обрабатывать данные без разделителей
только пробел, в обычном блокноте, есть функция "Заменить"
выделяешь пробел и ставишь заменить на ; весь текст и вуаля
сырая база готова, потом импортируешь ее в dbf

Кстати можно накатить pip install duckdb
0
 Аватар для Pphantom
2276 / 1531 / 714
Регистрация: 17.03.2022
Сообщений: 4,917
23.09.2025, 15:23
Цитата Сообщение от avedeo Посмотреть сообщение
А базой данных можно назвать любой набор данных, содержащий
регулярную инфу в виде столбиков и строк, сиречь полей и записей
И даже это не обязательно - далеко не все базы данных (вернее, СУБД) являются реляционными.
0
-610 / 35 / 0
Регистрация: 10.03.2025
Сообщений: 485
23.09.2025, 15:35
Pphantom, Конечно типа ключ- значение, но совершенно согласен
что без механизма выборки данных по запросу, индексов, логгирования работы
без масштабирования, реплицирования, целостности данных путем
блокирования или частичного блокирования, при вставке, удалении, обновлении ,
это всего лишь заготовка, но любой труд почетен
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
23.09.2025, 15:37
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Но то что хотя бы "записная книжка" уж точно.
Ну с этим не поспоришь) А как выбирал способ хранения?
Я бы скорее выбрал csv или json было бы гораздо проще делать выборки или валидировать
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
24.09.2025, 19:31
Вот вам делать нечего... Модуль sqlite3 встроен в стандартную библиотеку Python, начиная с версии Python 2.5... Работает даже на одноплатниках с 64Mb памяти.
1
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
24.09.2025, 20:59
Цитата Сообщение от u235 Посмотреть сообщение
Вот вам делать нечего...
Насколько я понял - ТС это делал в порядке обучения, что похвально. Просто это не совсем про БД, но с этим мы уже разобрались. Пример работы с текстовыми данными.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
24.09.2025, 23:27
Цитата Сообщение от ViachaslauK Посмотреть сообщение
Пример работы с текстовыми данными.
Там же панда какая то есть для этого.
0
108 / 103 / 18
Регистрация: 05.08.2021
Сообщений: 487
24.09.2025, 23:51  [ТС]
Где именно китайский мишка?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.09.2025, 00:05
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Где именно китайский мишка?
About pandas #
Конечно, может быть не в тему этой темы.

Добавлено через 8 минут
Zloyalex100
От этих панд могут закипеть мозги.
Суть в том, что то что делаешь ты, на практике почти никто не делает.
В код намешаны все возможные сущности в один флакон.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.09.2025, 00:05
Помогаю со студенческими работами здесь

Зачем python нужен? Работу всё-равно не найти: вот некоторый обзор требований
Ищем Python программиста в связи с расширением штата разработчиков. Проект связан с автоматизацией...

Разогнать вот этот scanner tulpar да в Google был
Всем привет не могу разогнать вот этот scanner tulpar да в Google был тыц :) не помогло мне это...

как считать вот такое 10/3
как считать такую строку и разбить на числа? 10/3 a=input() a=10 a=3 ...

хочу что бы при нажатие на кнопку фотография обрезалась по определенно заданному формату,вот мой код
from tkinter import * from PIL import ImageTk, Image root = Tk ( ) root.geometry ('450x330') ...

подскажите пожалуйста. Вот код и мне надо сделать так ,чтобы добавление слова осуществлялось только на русском,а перевод
def start(): print('Выберите пункт меню, введя число: ') print('1 – Добавить новое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru