DB to .txt

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
Здравствуйте!
Есть задачка создать базу данных простенькую в .txt. Нужно создать класс человек, у которого будут аргументы имя, фамилия и идентификационный номер. Проблема такова, как вызывать функции с аргументом self, или как бы вы сделали (опираяся на скрин в закрепе).

Screenshot_69.png

Python:
file = open('db.txt', 'w+')
class Person:
    def __init__(self, name, surname, pesel):
        self.name = name
        self.surname = surname
        self.pesel = pesel

    def __str__(self):
        file = open('db.txt', 'w+')
        pesel = input("podaj pesel osoby, ktora chcesz wyswietlic")
        return f"{self.name}, {self.surname} ma {self.pesel} pesel"

    def addNewPerson(self, file):
        print("podaj imie, nazwisko oraz pesel osoby, ktora chcesz dodac")
        imie = input("Imie:")
        nazwisko = input("Nazwisko:")
        pesel = input("Pesel:")
        file = open('db.txt', 'w+')
        file.write(person = Person('Jan', 'Kowalski','82010200131'))

    def removePerson(self):
        file = open('db.txt', 'w+')
        print("podaj pesel osoby, ktora chcesz usunac")

    def showPerson(self):
        file = open('db.txt', 'w+')


Заранее спасибо!
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
На самом деле, мне кажется у вас какой-то странный класс.
Обычно класс делает что-то конкретное. Например, судя по __init__ вашего класса, это класс с информацией об одном человеке, но при этом у него есть метод addNewPerson, который добавляет в базу человека.
Метод __str__ зачем-то открывает базу данных, а потом ничего с ней не делает.
Возможно стоит сделать как-то так:
Python:
class DB:
    """
    Класс для работы с текстовой базой данных
    """   
    def __init__(self, path: str):
        """
        Args:
            path (str): Путь к базе данных
        """
        self.path = path
    def __str__(self):
        with open(self.path) as file:
            return file.read()

    def add_new_person(self):
        """
        Добавляет человека в базу данных
        """       
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        with open(self.path, 'a+') as file:
            if ID not in file.read():
                file.write(f"{name}, {surname}, {ID}\n")
            else:
                print('id is in use, select another id')

    def remove_person(self):
        """
        Удаляет человека из базы данных
        """       
        ID = input("ID: ")
        with open(self.path, 'r') as file:
            text = '\n'.join(
                filter(lambda x: f" {ID}\n" not in x, file.readlines()))
        with open(self.path, 'w') as file:
            file.write(text)

    def show_person(self):
        """
        Показывает информацию о человеке
        """       
        ID = input("ID: ")
        with open(self.path, 'r') as file:
            print(list(filter(lambda x: f" {ID}\n" in x, file.readlines()))[0])

if __name__ == "__main__":
    path = "db.txt"
    p = DB(path)
    p.add_new_person()
    print(p)

Хотя лучше уж для простых баз данных использовать json файлы
 
  • Мне нравится
Реакции: DenDonnar

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
А почему считаете, что json лучше?
Возможно потому что если в txt было бы много данных и удалить строчку, то все бы передвигать пришлось*
json оставаясь читаемым, легко конвертируется в python словарь, добавлять и удалять пользователей, находить их по id, можно без перебора строк в цикле. Это работает намного быстрее. Проще написать программу, есть встроенный модуль json, с ном проще. Данные можно быстрей парсить, словарь проще обработать.
 
  • Мне нравится
Реакции: DenDonnar

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
А почему считаете, что json лучше?
Возможно потому что если в txt было бы много данных и удалить строчку, то все бы передвигать пришлось*
Python:
import json

class DB:
    """
    Класс для работы с текстовой базой данных
    """
    def __init__(self, path: str):
        """
        Args:
            path (str): Путь к базе данных
        """
        self.path = path
        with open(self.path, 'r+') as file:
            f = file.read().strip()
            if len(f) != 0:
                if f[0] != '{' or f[-1] != '}':
                    f = '{}'
            else:
                f = '{}'
            self.data = json.loads(f)
    def __str__(self):
        return json.dumps(self.data)
    def add_new_person(self):
        """
        Добавляет человека в базу данных
        """
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        if ID not in self.data:
            self.data[ID] = {'name': name, 'surname': surname}
        self.save()
    def remove_person(self):
        """
        Удаляет человека из базы данных
        """
        ID = input("ID: ")
        del self.data['ID']
        self.save()
    def show_person(self):
        """
        Показывает информацию о человеке
        """
        ID = input("ID: ")
        print(self.data['ID'])
    def save(self):
        with open(self.path, 'w') as file:
            json.dump(self.data, file)

if __name__ == "__main__":
    path = "db.json"
    p = DB(path)
    p.add_new_person()
    print(p)
 
  • Мне нравится
Реакции: DenDonnar

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Важные моменты:
1) Не надо определять класс в цикле while, его надо определить в начале
2) Нет смысла каждый раз заново задавать переменную path и p

Лучше думаю сделать так:
Python:
import json


class DB:
    """
    Klassa dla pracy z tekstowa DB
    """

    def __init__(self, path: str):
        """
        Args:
            path (str): Sciezka do Bazy Danych
        """
        self.path = path
        with open(self.path, 'r+') as file:
            f = file.read().strip()
            if len(f) != 0:
                if f[0] != '{' or f[-1] != '}':
                    f = '{}'
            else:
                f = '{}'
            self.data = json.loads(f)

    def __str__(self):
        return json.dumps(self.data)

    def add_new_person(self):
        """
        Dodajemy osobe w DB
        """
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        if ID in self.data:
            print("Osoba o takim PESEL'u juz istnieje. Sprawdz poprawnosc dannych.")

        if ID not in self.data:
            self.data[ID] = {'name': name, 'surname': surname}
        self.save()

    def remove_person(self):
        """
        Usuniecie osoby z DB
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje, ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            del self.data[ID]
            self.save()

    def show_person(self):
        """
        Wyswietlanie informacji o osobie po podanym PESEL
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje. Mozesz ja dodac, albo ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data[ID], indent=2))

    def save(self):
        with open(self.path, 'w') as file:
            # indent dla ladnego zapisu
            json.dump(self.data, file, indent=2)


path = "db.json"
p = DB(path)

funcs = [p.add_new_person, p.remove_person, p.show_person]

while True:
    choice = int(
        input("wpisz działanie\n1 : dodaj | 2 : usun | 3 : pokaz | 0 : zamknij: "))

    if not choice:
        break
    funcs[choice-1]()
 
  • Мне нравится
Реакции: DenDonnar

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Ну ты был рядом:
Python:
if os.path.isfile(file1):
    if os.path.isfile(file2):
        with open("db.json") as inp, open("db_copy.json", "w") as out:
            out.write(inp.read())
    else:
        print("plik o nazwie", file2, "nie istnieje")

Несколько важных моментов:
1) Вовсе не обязательно проверять наличие файла куда копируется json, ведь при его открытии он все равно создастся
2) Возможно надо не файл копировать, а сохранять открытую на данный момент базу данных
 
  • Мне нравится
Реакции: DenDonnar

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
Может неправильно выбран формат кода? Не json, а что-то еще
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
В VSCode можно выбрать какой язык в файле (Python / JS / др), такое есть и в других программах
1642609001862.png
 
  • Мне нравится
Реакции: DenDonnar

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
if os.path.isfile(file1): if os.path.isfile(file2): with open("db.json") as inp, open("db_copy.json", "w") as out: out.write(inp.read()) else: print("plik o nazwie", file2, "nie istnieje")
а на питоне можно любой файл даже картинку скопировать и перемести в другую папку ну и по пути поменять его имя? как? это разве не проще предложенного?
 
  • Мне нравится
Реакции: DenDonnar

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
а на питоне можно любой файл даже картинку скопировать и перемести в другую папку ну и по пути поменять его имя? как? это разве не проще предложенного?
Да, я думал про это, но раз уж человек пошел сложным путем... А так `лишние` импорты.
 
  • Мне нравится
Реакции: DenDonnar

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
На самом деле, мне кажется у вас какой-то странный класс.
Обычно класс делает что-то конкретное. Например, судя по __init__ вашего класса, это класс с информацией об одном человеке, но при этом у него есть метод addNewPerson, который добавляет в базу человека.
Метод __str__ зачем-то открывает базу данных, а потом ничего с ней не делает.
Возможно стоит сделать как-то так:
Python:
class DB:
    """
    Класс для работы с текстовой базой данных
    """  
    def __init__(self, path: str):
        """
        Args:
            path (str): Путь к базе данных
        """
        self.path = path
    def __str__(self):
        with open(self.path) as file:
            return file.read()

    def add_new_person(self):
        """
        Добавляет человека в базу данных
        """      
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        with open(self.path, 'a+') as file:
            if ID not in file.read():
                file.write(f"{name}, {surname}, {ID}\n")
            else:
                print('id is in use, select another id')

    def remove_person(self):
        """
        Удаляет человека из базы данных
        """      
        ID = input("ID: ")
        with open(self.path, 'r') as file:
            text = '\n'.join(
                filter(lambda x: f" {ID}\n" not in x, file.readlines()))
        with open(self.path, 'w') as file:
            file.write(text)

    def show_person(self):
        """
        Показывает информацию о человеке
        """      
        ID = input("ID: ")
        with open(self.path, 'r') as file:
            print(list(filter(lambda x: f" {ID}\n" in x, file.readlines()))[0])

if __name__ == "__main__":
    path = "db.txt"
    p = DB(path)
    p.add_new_person()
    print(p)

Хотя лучше уж для простых баз данных использовать json файлы
А почему считаете, что json лучше?
Возможно потому что если в txt было бы много данных и удалить строчку, то все бы передвигать пришлось*
 

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
На самом деле, мне кажется у вас какой-то странный класс.
Обычно класс делает что-то конкретное. Например, судя по __init__ вашего класса, это класс с информацией об одном человеке, но при этом у него есть метод addNewPerson, который добавляет в базу человека.
Метод __str__ зачем-то открывает базу данных, а потом ничего с ней не делает.
Возможно стоит сделать как-то так:
Python:
class DB:
    """
    Класс для работы с текстовой базой данных
    """  
    def __init__(self, path: str):
        """
        Args:
            path (str): Путь к базе данных
        """
        self.path = path
    def __str__(self):
        with open(self.path) as file:
            return file.read()

    def add_new_person(self):
        """
        Добавляет человека в базу данных
        """      
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        with open(self.path, 'a+') as file:
            if ID not in file.read():
                file.write(f"{name}, {surname}, {ID}\n")
            else:
                print('id is in use, select another id')

    def remove_person(self):
        """
        Удаляет человека из базы данных
        """      
        ID = input("ID: ")
        with open(self.path, 'r') as file:
            text = '\n'.join(
                filter(lambda x: f" {ID}\n" not in x, file.readlines()))
        with open(self.path, 'w') as file:
            file.write(text)

    def show_person(self):
        """
        Показывает информацию о человеке
        """      
        ID = input("ID: ")
        with open(self.path, 'r') as file:
            print(list(filter(lambda x: f" {ID}\n" in x, file.readlines()))[0])

if __name__ == "__main__":
    path = "db.txt"
    p = DB(path)
    p.add_new_person()
    print(p)

Хотя лучше уж для простых баз данных использовать json файлы
В общем доработал я все и спасибо вам, что направили меня на правильный путь, дальше уже доаботал код, исправил 2 ошибки и все прекрасно работает.


Python:
import json

while True:
    choice = int(input("wpisz działanie\n1 : dodaj | 2 : usun | 3 : pokaz | 4 : zamknij: "))
    class DB:
        """
        Klassa dla pracy z tekstowa DB
        """
        def __init__(self, path: str):
            """
            Args:
                path (str): Sciezka do Bazy Danych
            """
            self.path = path
            with open(self.path, 'r+') as file:
                f = file.read().strip()
                if len(f) != 0:
                    if f[0] != '{' or f[-1] != '}':
                        f = '{}'
                else:
                    f = '{}'
                self.data = json.loads(f)


        def __str__(self):
            return json.dumps(self.data)


        def add_new_person(self):
            """
            Dodajemy osobe w DB
            """
            name = input("Name: ")
            surname = input("Surname: ")
            ID = input("ID: ")
            if ID in self.data:
                print("Osoba o takim PESEL'u juz istnieje. Sprawdz poprawnosc dannych.")

            if ID not in self.data:
                self.data[ID] = {'name': name, 'surname': surname}
            self.save()


        def remove_person(self):
            """
            Usuniecie osoby z DB
            """
            ID = input("ID: ")
            if ID not in self.data:
                print("Osoba o takim PESEL nie istnieje, ewentualnie sprawdz poprawnosc wprowadzonych dannych")
            else:
                del self.data[ID]
                self.save()


        def show_person(self):
            """
            Wyswietlanie informacji o osobie po podanym PESEL
            """
            ID = input("ID: ")
            if ID not in self.data:
                print("Osoba o takim PESEL nie istnieje. Mozesz ja dodac, albo ewentualnie sprawdz poprawnosc wprowadzonych dannych")
            else:
                print(json.dumps(self.data[ID], indent=2)) #indent dla ladnego wyswietlania

        def save(self):
            with open(self.path, 'w') as file:
                json.dump(self.data, file, indent=2) #indent dla ladnego zapisu


    """A tu juz wszystko proste. Prosty User Interface"""

    if choice == 1:
        path = "db.json"
        p = DB(path)
        p.add_new_person()
    elif choice == 2:
        path = "db.json"
        p = DB(path)
        p.remove_person()
    elif choice == 3:
        path = "db.json"
        p = DB(path)
        p.show_person()
    elif choice == 4:
        print("Koniec pracy!")
        break
 
  • Мне нравится
Реакции: Vershitel_sudeb

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
Важные моменты:
1) Не надо определять класс в цикле while, его надо определить в начале
2) Нет смысла каждый раз заново задавать переменную path и p

Лучше думаю сделать так:
Python:
import json


class DB:
    """
    Klassa dla pracy z tekstowa DB
    """

    def __init__(self, path: str):
        """
        Args:
            path (str): Sciezka do Bazy Danych
        """
        self.path = path
        with open(self.path, 'r+') as file:
            f = file.read().strip()
            if len(f) != 0:
                if f[0] != '{' or f[-1] != '}':
                    f = '{}'
            else:
                f = '{}'
            self.data = json.loads(f)

    def __str__(self):
        return json.dumps(self.data)

    def add_new_person(self):
        """
        Dodajemy osobe w DB
        """
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        if ID in self.data:
            print("Osoba o takim PESEL'u juz istnieje. Sprawdz poprawnosc dannych.")

        if ID not in self.data:
            self.data[ID] = {'name': name, 'surname': surname}
        self.save()

    def remove_person(self):
        """
        Usuniecie osoby z DB
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje, ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            del self.data[ID]
            self.save()

    def show_person(self):
        """
        Wyswietlanie informacji o osobie po podanym PESEL
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje. Mozesz ja dodac, albo ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data[ID], indent=2))

    def save(self):
        with open(self.path, 'w') as file:
            # indent dla ladnego zapisu
            json.dump(self.data, file, indent=2)


path = "db.json"
p = DB(path)

funcs = [p.add_new_person, p.remove_person, p.show_person]

while True:
    choice = int(
        input("wpisz działanie\n1 : dodaj | 2 : usun | 3 : pokaz | 0 : zamknij: "))

    if not choice:
        break
    funcs[choice-1]()

А как же тогда можно скопировать данные из одно json в другой json?

Нужно, чтобы в методе copy_file файл копировал данные из одного json в другой (например из db.json в db_copy.json). Весь интернет обрыл и даже англоязычный и все, что перепробовал не сохраняло либо либо не работало.

Заранее спасибо!*

Вот код ( я его буквально немного переделал ):


Python:
import json
import shutil #wbudowana biblioteka python do pracy z plikami
import os
class DB:
    """
    Klassa dla pracy z tekstowa DB
    """
    def __init__(self, path: str):
        """
        Args:
            path (str): Sciezka do Bazy Danych
        """
        self.path = path
        with open(self.path, 'w+') as file:
            f = file.read().strip()
            if len(f) != 0:
                if f[0] != '{' or f[-1] != '}':
                    f = '{}'
            else:
                f = '{}'
            self.data = json.loads(f)

    def __str__(self):
        return json.dumps(self.data)

    def add_new_person(self):
        """
        Dodajemy osobe w DB
        """
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        if ID in self.data:
            print("Osoba o takim PESEL'u juz istnieje. Sprawdz poprawnosc dannych.")

        if ID not in self.data:
            self.data[ID] = {'name': name, 'surname': surname}
        self.save()

    def remove_person(self):
        """
        Usuniecie osoby z DB
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje, ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            del self.data[ID]
            self.save()

    def show_person(self):
        """
        Wyswietlanie informacji o osobie po podanym PESEL
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje. Mozesz ja dodac, albo ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data[ID], indent=2))

    def show_everybody(self):
        """
        Wyswietlanie calej bazy danych
        """
        if len(self.data) == 0:
            print(
                "Niema zadnego zapisu w bazie danych, ale mozesz dodac jakis!")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data, indent=2))

    def copy_file(self):
        """
        Kopiowanie pliku (sprawdzamy czy istnieje)
        """
        file1 = 'db.json'
        file2 = 'db_copy.json'
        if os.path.isfile(file1):
            if os.path.isfile(file2):
                #open("db.json", "w").write(open("db_copy.json").read()) ничего не дает
            else:
                print("plik o nazwie", file2, "nie istnieje")
        else:
            print("plik o nazwie", file1, "nie istnieje")

    def save(self):
        with open(self.path, 'w') as file:
            # indent dla ladnego zapisu
            json.dumps(self.data, file, indent=2)


path = "db.json"
p = DB(path)

funcs = [p.add_new_person, p.remove_person, p.show_person, p.show_everybody, p.copy_file]

while True:
    choice = int(
        input("wpisz działanie\n1 : dodaj | 2 : usun | 3 : pokaz | 4 : pokaz wszystko | 5 : kopiuj plik | 0 : zamknij: "))

    if not choice:
        break
    funcs[choice-1]()
 

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
Ну ты был рядом:
Python:
if os.path.isfile(file1):
    if os.path.isfile(file2):
        with open("db.json") as inp, open("db_copy.json", "w") as out:
            out.write(inp.read())
    else:
        print("plik o nazwie", file2, "nie istnieje")

Несколько важных моментов:
1) Вовсе не обязательно проверять наличие файла куда копируется json, ведь при его открытии он все равно создастся
2) Возможно надо не файл копировать, а сохранять открытую на данный момент базу данных
Короче сделал вот так, но копирует как-то странно и я признаюсь первый раз такое вижу. Копирует вроде json, но он не выглядит как json.

Вот скрины

Screenshot_286.png

Screenshot_287.png

Снизу последняя версия кода*






Python:
import json
import os

class DB:
    """
    Klassa dla pracy z tekstowa DB
    """

    def __init__(self, path: str):
        """
        Args:
            path (str): Sciezka do Bazy Danych
        """
        self.path = path
        with open(self.path, 'r+') as file:
            f = file.read().strip()
            if len(f) != 0:
                if f[0] != '{' or f[-1] != '}':
                    f = '{}'
            else:
                f = '{}'
            self.data = json.loads(f)

    def __str__(self):
        return json.dumps(self.data)

    def add_new_person(self):
        """
        Dodajemy osobe w DB
        """
        name = input("Name: ")
        surname = input("Surname: ")
        ID = input("ID: ")
        if ID in self.data:
            print("Osoba o takim PESEL'u juz istnieje. Sprawdz poprawnosc dannych.")

        if ID not in self.data:
            self.data[ID] = {'name': name, 'surname': surname}
        self.save()

    def remove_person(self):
        """
        Usuniecie osoby z DB
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje, ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            del self.data[ID]
            self.save()

    def show_person(self):
        """
        Wyswietlanie informacji o osobie po podanym PESEL
        """
        ID = input("ID: ")
        if ID not in self.data:
            print(
                "Osoba o takim PESEL nie istnieje. Mozesz ja dodac, albo ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data[ID], indent=2))

    def show_everybody(self):
        """
        Wyswietlanie calej bazy danych
        """
        if len(self.data) == 0:
            print(
                "Niema zadnego zapisu w bazie danych, ale mozesz dodac jakis!")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data, indent=2))

    def copy_file(self):
        """
        Kopiowanie pliku (sprawdzamy czy istnieje)
        """
        file1 = 'db.json'
        file2 = 'db_copy.json'
        if os.path.isfile(file1):
            if os.path.isfile(file2):
                with open("db.json") as inp, open("db_copy.json", "w") as out:
                    out.write(inp.read())
            else:
                print("plik o nazwie", file2, "nie istnieje")

    def save(self):
        with open(self.path, 'w') as file:
            # indent dla ladnego zapisu
            json.dump(self.data, file, indent=2)


path = "db.json"
p = DB(path)

funcs = [p.add_new_person, p.remove_person, p.show_person, p.show_everybody, p.copy_file]

while True:
    choice = int(
        input("wpisz działanie\n1 : dodaj | 2 : usun | 3 : pokaz | 4 : pokaz_wszystkich | 5 : kopiuj_plik | 0 : zamknij: "))

    if not choice:
        break
    funcs[choice-1]()
 

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
Может неправильно выбран формат кода? Не json, а что-то еще
Что вы имеете ввиду?
 

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
Хм, а как интересно вытянуть значение с .json с такой структурой:

JSON:

JSON:
{
  "SpeedFire": {
    "name": "Lukasz",
    "surname": "Kotwica",
    "weight": 92,
    "age": 28,
    "wins": 14,
    "power": 780
  },
  "Honey Badger": {
    "name": "Adam",
    "surname": "Smith",
    "weight": 89,
    "age": 32,
    "wins": 19,
    "power": 820
  },
  "The Golden Boy": {
    "name": "Franklin",
    "surname": "Samson",
    "weight": 88,
    "age": 26,
    "wins": 13,
    "power": 630
  }
}

В def_fight хочу по никнейму вытянуть параметр боксера (например power), но добраться не могу никак
Вот ниже Python

Python:
import json
import os

class DB:
    """
    Klassa dla pracy z tekstowa DB
    """

    def __init__(self, path: str):
        """
        Args:
            path (str): Sciezka do Bazy Danych
        """
        self.path = path
        with open(self.path, 'r+') as file:
            f = file.read().strip()
            if len(f) != 0:
                if f[0] != '{' or f[-1] != '}':
                    f = '{}'
            else:
                f = '{}'
            self.data = json.loads(f)

    def __str__(self):
        return json.dumps(self.data)

    def add_new_person(self):
        """
        Dodajemy boksera
        """
        name = input("Name: ")
        surname = input("Surname: ")
        weight = int(input("Weight: "))
        age = int(input("Age: "))
        wins = int(input("Wins: "))
        power = int(input("Power: "))

        NickName = input("NickName: ")
        if NickName in self.data:
            print("Osoba o takim NickName`ie juz istnieje. Sprawdz poprawnosc dannych.")

        if NickName not in self.data:
            self.data[NickName] = {'name': name, 'surname': surname, 'weight': weight, 'age': age, 'wins': wins, 'power': power}
        self.save()

    def remove_person(self):
        """
        Usuniecie osoby z DB
        """
        NickName = input("NickName: ")
        if NickName not in self.data:
            print("Bokser o takim NickName`ie nie istnieje, ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            del self.data[NickName]
            self.save()

    def show_person(self):
        """
        Wyswietlanie informacji o Bokserze po NickName
        """
        NickName = input("NickName: ")
        if NickName not in self.data:
            print("Bokser o takim NickName`ie nie istnieje. Mozesz go dodac, albo ewentualnie sprawdz poprawnosc wprowadzonych dannych")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data[NickName], indent=2))

    def show_everybody(self):
        """
        Wyswietlanie calej bazy danych
        """
        if len(self.data) == 0:
            print(
                "Niema zadnego zapisu w bazie danych, ale mozesz dodac jakis!")
        else:
            # indent dla ladnego wyswietlania
            print(json.dumps(self.data, indent=2))

    def copy_file(self):
        """
        Kopiowanie pliku (sprawdzamy czy istnieje)
        """
        file1 = input("wpisz nazwe pliku (na przykład db.json):")
        file2 = input("wpisz nazwe pliku (na przykład db_copy.json):")
        if os.path.isfile(file1):
            if os.path.isfile(file2):
                with open(file1) as inp, open(file2, "w") as out:
                    out.write(inp.read())
            else:
                print("plik o nazwie", file2, "nie istnieje")

    def show_user_file(self):
        """
        Wyswietli dane z pliku podanego przez uzytkownika
        """
        user_file = input("podaj nazwe pliku (.json), ktory chcesz wyswietlic (naprzyklad db_copy.json): ")
        if os.path.isfile(user_file):
            if os.stat(user_file).st_size == 0:
                print("Ten plik jest pusty!")
            else:
                with open(user_file) as uf:
                    print(uf.read())
        else:
            print("plik o nazwie", user_file, "nie istnieje")

    def save(self):
        with open(self.path, 'w') as file:
            # indent dla ladnego zapisu
            json.dump(self.data, file, indent=2)

    def fight(self):
        print("Podaj NickName dwoch bokserow by zorganizowac walke.")
        first_fighter = 'SpeedFire'
        #second_fighter = json.loads(input("Wpisz NickName drugiego: "))
        if first_fighter in self.data:
            print(json.dumps(self.data[first_fighter], indent=2))



path = "db.json"
p = DB(path)

funcs = [p.add_new_person, p.remove_person, p.show_person, p.show_everybody, p.copy_file, p.show_user_file, p.fight]

while True:
    choice = int(
        input("wpisz działanie\n1 : dodaj | 2 : usun | 3 : pokaz | 4 : pokaz_wszystkich | 5 : kopiuj_plik | 6 : wyswietlij_z_pliku | 7 : walka | 0 : zamknij: "))

    if not choice:
        break
    funcs[choice-1]()

Заранее спасибо!
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 587
459
83
я не понимаю языка, на котором написан текст, наверное там написано введите никнейм боксера для получения чего то...
можно так
Python:
...

def fight(self):
    # print("Podaj NickName dwoch bokserow by zorganizowac walke.")
    first_fighter = input("Podaj NickName dwoch bokserow by zorganizowac walke: ")
    # second_fighter = json.loads(input("Wpisz NickName drugiego: "))
    if first_fighter in self.data:
        print(json.dumps(self.data[first_fighter]["power"], indent=2))
       
...
 
  • Мне нравится
Реакции: DenDonnar

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
я не понимаю языка, на котором написан текст, наверное там написано введите никнейм боксера для получения чего то...
можно так
Python:
...

def fight(self):
    # print("Podaj NickName dwoch bokserow by zorganizowac walke.")
    first_fighter = input("Podaj NickName dwoch bokserow by zorganizowac walke: ")
    # second_fighter = json.loads(input("Wpisz NickName drugiego: "))
    if first_fighter in self.data:
        print(json.dumps(self.data[first_fighter]["power"], indent=2))
      
...
Это польский, очень простой для славян:)
Сейчас попробую ваш ответ*
 

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
я не понимаю языка, на котором написан текст, наверное там написано введите никнейм боксера для получения чего то...
можно так
Python:
...

def fight(self):
    # print("Podaj NickName dwoch bokserow by zorganizowac walke.")
    first_fighter = input("Podaj NickName dwoch bokserow by zorganizowac walke: ")
    # second_fighter = json.loads(input("Wpisz NickName drugiego: "))
    if first_fighter in self.data:
        print(json.dumps(self.data[first_fighter]["power"], indent=2))
      
...
Да, все прекрасно работает, огромнейшее вас спасибо!
 

DenDonnar

Новичок
Пользователь
Дек 16, 2021
12
1
3
я не понимаю языка, на котором написан текст, наверное там написано введите никнейм боксера для получения чего то...
можно так
Python:
...

def fight(self):
    # print("Podaj NickName dwoch bokserow by zorganizowac walke.")
    first_fighter = input("Podaj NickName dwoch bokserow by zorganizowac walke: ")
    # second_fighter = json.loads(input("Wpisz NickName drugiego: "))
    if first_fighter in self.data:
        print(json.dumps(self.data[first_fighter]["power"], indent=2))
      
...
А если захочу ключ вывести, то как попроще?:)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 587
459
83
А если захочу ключ вывести, то как попроще?:)
вы же выводите по ключу, значит вы его знаете, просто добавляете в вывод строку с ключом....
print(f"power:{json.dumps(self.data[first_fighter]['power'], indent=2)}")
 
  • Мне нравится
Реакции: DenDonnar

Форум IT Специалистов