Как получить информацию из файла file.txt после его добавления перед выключением программы - PullRequest
0 голосов
/ 10 июля 2020

Я учусь создавать файлы .txt, а также как их писать и читать, проблема, с которой я столкнулся сейчас, заключается в том, что я хочу создать программу, в которой я могу создавать, редактировать и удалять символы, похожие на таблицу и что эти новые символы сохраняются в файле .txt

Увидев, что у персонажей есть общие атрибуты, я подумал об использовании классов, я не особо в этом разбираюсь, но знаю немного, мой основной идея заключалась в том, чтобы запросить атрибуты и сгенерировать объект и добавить его в список символов, делая это таким образом, все в порядке, но данные не сохраняются при повторном запуске программы

class PLAYER:
    def __init__(self,Name,Attack,Defense,Health):
        self.Name=Name
        self.Attack=Attack
        self.Defense=Defense
        self.Health=Health

options=[0,1,2,3]
characters=[]

while True:
    counter=0
    archive = open("players.txt","w")
    print("ID|NAME|ATTACK|DEFENSE|HEALTH")
    while counter != len(characters):
        print("(",counter,")", characters[0+counter].Name,characters[0+counter].Attack,characters[0+counter].Defense,characters[0+counter].Health)
        counter += 1
    print("Character Manager")
    print("( 0 ) Create")
    print("( 1 ) Edit")
    print("( 2 ) Delete")
    print("( 3 ) Exit")
    while True:#Choose the option
        try:
            option=int(input("-> "))
            while option not in options:
                print("Are you looking to find more options? Sorry, friend, there is no budget for that")
                option=int(input("-> "))
            break
        except ValueError:
            print("Please write the number in parentheses of the option you want to do")
        
    if option==3:#Exit
        archive.close()
        break
    elif option==0:#Crear
        NAME=input("What will his name be? ")
        while True:#Ataque
            try:
                ATTACK=int(input("How much attack will it have? "))
                break
            except:
                print("please put an integer value")
        while True:#Defensa
            try:
                DEFENSE=input("How much will your defense be? ")
                break
            except:
                print("please put an integer value")
        while True:#Vida
            try:
                HEALTH=input("How much life will it have?")
                break
            except:
                print("please put an integer value")
        characters.append(PLAYER(NAME,ATTACK,DEFENSE,HEALTH))
    elif option==1:#Edit
        print("Which character do you want to edit?")
        ID=int(input("-> "))
        characters.remove(characters[ID])
        NAME=input("What will be his new name? ")
        while True:#Ataque
            try:
                ATTACK=int(input("How much attack will it have? "))
                break
            except:
                print("please put an integer value")
        while True:#Defensa
            try:
                DEFENSE=input("How much will your defense be?")
                break
            except:
                print("please put an integer value")
        while True:#Vida
            try:
                HEALTH=input("How much life will it have?")
                break
            except:
                print("please put an integer value") 
        characters.append(PLAYER(NAME,ATTACK,DEFENSE,HEALTH))
    elif option==2:#Delete
        print("¿Qué personaje quieres eliminar?")
        ID=int(input("-> "))
        characters.remove(characters[ID])

Вверх до этого момента я не использовал файл .txt, чтобы снова не показывать полный код, я помещаю только те части, которые меняются.

    counter=0
    archive = open("players.txt","w")
    print("ID|NAME|ATTACK|DEFENSE|HEALTH")
    while counter != len(characters):
        a=("(",counter,")", characters[0+counter].Name,characters[0+counter].Attack,characters[0+counter].Defense,characters[0+counter].Health)
        archive.write(a)
        archive.write("\n")
        counter += 1
    archive.close()
    archive = open("personajes.txt","r")
    print(archive.read())
    print("Character Manager")
    print("( 0 ) Create")
    print("( 1 ) Edit")
    print("( 2 ) Delete")
    print("( 3 ) Exit")

Проблема, которую я обнаружил здесь, заключается в том, что аргумент записи должен быть str, а не кортеж, но при установке

a = str ("all the stuff")

Мне кажется

TypeError: str() takes at most 3 arguments (7 given)

Итак, пока у меня заканчиваются идеи, чтобы найти способ решить эту проблему, я надеюсь, что вы может помочь мне решить эту проблему, поскольку я не смог найти решение самостоятельно

пример того, что я ищу, выглядит следующим образом

ID|NAME|ATTACK|DEFENSE|HEALTH
Character Manager
( 0 ) Create
( 1 ) Edit
( 2 ) Delete
( 3 ) Exit

-> 0

What will his name be? Joseph

How much attack will it have? 20

How much will your defense be? 10

How much life will it have?50
ID|NAME|ATTACK|DEFENSE|HEALTH
( 0 ) Joseph 20 10 50
Character Manager
( 0 ) Create
( 1 ) Edit
( 2 ) Delete
( 3 ) Exit

но я хочу это, когда я start, старые зарегистрированные символы появляются, если есть

Если я использую f-строку

    counter=0
    archive = open("players.txt","w")
    print("ID|NAME|ATTACK|DEFENSE|HEALTH")
    while counter != len(characters):
        a=f"( {counter} ) {characters[counter].Name} {characters[counter].Attack} {characters[counter].Defense} {characters[counter].Health}"
        archive.write(a)
        archive.write("\n")
        counter += 1
    archive.close()
    archive = open("personajes.txt","r")
    print(archive.read())

Новые символы печатаются, но в момент закрытия программы и повторного открытия символов, которые где создано до исчезновения

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы можете использовать pickle для хранения и извлечения объектов на диск. Вот пример, основанный на вашем коде:

import pickle

class Player:
    def __init__(self, name, attack, defense, health):
        self.name = name
        self.attack = attack
        self.defense = defense
        self.health = health
        
    def __str__(self):
        return f"{self.name} {self.attack} {self.defense} {self.health}"

# Create 2 objects and save
def create_and_save():
    p1 = Player("name1", 1, 2, 3)
    p2 = Player("name2", 4, 5, 6)
    with open("players.bin", "wb") as f:
        pickle.dump(p1, f)
        pickle.dump(p2, f)

# Load the previously store object and print them
def load_data():
    with open("players.bin", "rb") as f:
        p1 = pickle.load(f)
        p2 = pickle.load(f)
    print(p1)
    print(p2)

choice = int(input("1. Save, 2. Load: "))
if choice == 1:
    create_and_save()
else:
    load_data()

Запустите программу дважды. В первый раз введите «1», а второй раз введите «2».

PS Я изменил имена членов класса, чтобы они соответствовали руководству .

0 голосов
/ 10 июля 2020

используйте понимание списка, чтобы создать все строки как строки, а затем используйте join, чтобы объединить их все с помощью \ n

info = '\n'.join([list comprehension here])
file.write(info)
...