У меня проблемы с рассолом - PullRequest
0 голосов
/ 08 января 2020

итак, пока я просто увлекаюсь кодированием и просто экспериментирую, я хотел создать базу данных, с которой было бы легко взаимодействовать для 170 (пока что) NPC, которые потребуются для моей кампании D & D.

Оказывается, объединение кусков кода без понимания их не всегда работает, шокер.

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

#import pickle
import pickle

#NPC ID generator 
counter=1
NPCS=[]
while counter<=170 :
    NPCS.append(counter)
    counter+=1


if len(NPCS)==170:
    print ("True")
else :
    print ("False") ; raise SystemExit 

#Attributes
name=[] ; occupation=[];weakness=[];need=[];desire=[];enemy=[];rumor=[];secret=[];passion=[]
redeemdamningquality=[];happy=[];occdesire=[];occcomplication=[];pcopinion=[];accomplish=[]
magical=[];politinfl=[];resource=[];intel=[];research=[]

NPCatt=[name,occupation,weakness,need,desire,enemy,rumor,secret,passion,redeemdamningquality,happy,occdesire,occcomplication,pcopinion, accomplish,magical,politinfl,resource,intel,research]  

#open a pickle file
newfile = 'NPCatt.pk'
#load your data back to memory when you need it
with open(newfile, 'rb') as fi:
  NPCatt = pickle.load(fi)

# Data Input 
print ("Enter the numerical code of the NPC you wish to modify")
raw=int(input())

if raw != ValueError :
    print ("Enter Name of NPC" + str(raw) ) ; a=input()
    if a!="":
        name.insert(raw+1,a);print ("Name Inserted Successfully")
    else:
        print ("Skipped!")

    print ("Enter Occupation of NPC" + str(raw) ) ;a=input()
    if a!="":
        occupation.insert(raw+1,a);print("Occupation Inserted Successfully")
    else:
        print ("Skipped!")
else :
    print ("BAD VALUE")

for x in (NPCatt) :
    if len(x)!=0 :
         print (x)
    elif len(x)>=170:
        print (x) ; print ("Has too many items")
    else :
        print (str(x) + "is empty")




with open(newfile, 'wb') as fi:
  # dump your data into the file
  pickle.dump(NPCatt, fi)

В чем я не уверен, так это в том, почему вводимые мной данные не «сохраняются» между запусками кода. Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 08 января 2020

ваша проблема - ваше понимание того, как работают переменные и назначения. В приведенном ниже коде вы делаете много списков. Затем вы создаете переменную с именем NPCatt, которая содержит ссылки на все эти списки, которые вы создали.

#Attributes
name=[] ; occupation=[];weakness=[];need=[];desire=[];enemy=[];rumor=[];secret=[];passion=[]
redeemdamningquality=[];happy=[];occdesire=[];occcomplication=[];pcopinion=[];accomplish=[]
magical=[];politinfl=[];resource=[];intel=[];research=[]

NPCatt=[name,occupation,weakness,need,desire,enemy,rumor,secret,passion,redeemdamningquality,happy,occdesire,occcomplication,pcopinion, accomplish,magical,politinfl,resource,intel,research]

Так что, если бы я посмотрел на NPCatt [0], это был бы список всех имен np c. что хорошо Однако вы затем go должны сделать

with open(newfile, 'rb') as fi:
  NPCatt = pickle.load(fi)

, теперь переменная NPCatt не указывает на все ваши списки. Теперь он указывает на не зачищенный объект. поэтому, когда вы позже сделаете names.append, он обновит список имен, но NPCatt больше не будет указывать на этот список. поэтому, когда вы маринуете NPCatt, ваш маринованный материал будет загружен только из файла.

В этом суть вашей ошибки. если вы хотите изменить данные, которые NPCatt хранит после того, как вы их выберете, то вы должны получить к ним доступ как

   if a!="":
        NPCatt[0].insert(raw+1,a);print ("Name Inserted Successfully")
    else:
        print ("Skipped!")

    print ("Enter Occupation of NPC" + str(raw) ) ;a=input()
    if a!="":
        NPCatt[1].insert(raw+1,a);print("Occupation Inserted Successfully")
    else:
        print ("Skipped!")

Однако это становится очень грязным, и неясно, какой список обновляется, так как вы должны обратиться к нему по позиции индекса. вместо этого вам лучше взглянуть на словарь python, так как вы можете ссылаться на вещи по имени, а не по позиции индекса. Или, что еще лучше, посмотрите на создание класса NP C и сохраните каждый NP C в диктовке по NPC_ID: NPC_CLASS_INSTANCE

ОБНОВЛЕНИЕ

Ниже приведен лишь краткий пример, который я собрал, используя класс для np c и указание хранить npcs по id. Это было просто сделано без всякого реального подхода к дизайну, плюсам и минусам, это просто сделано, чтобы показать вам в качестве примера.

# import pickle
import pickle
npcs_pickle_file = 'NPCatt.pk'
npc_count = 170

class NPC:
    def __init__(self, name="", occupation="", weakness="", need="", desire="", enemy="",
                 rumor="", secret="", passion="", redeem_damning_quality="", happy="",
                 occ_desire="", occ_complication="", pc_opinion="", accomplish="", magical="",
                 politinfl="", resource="", intel="", research=""):

        # Attributes
        self.name = name
        self.occupation = occupation
        self.weakness = weakness
        self.need = need
        self.desire = desire
        self.enemy = enemy
        self.rumor = rumor
        self.secret = secret
        self.passion = passion
        self.redeem_damning_quality = redeem_damning_quality
        self.happy = happy
        self.occ_desire = occ_desire
        self.occ_complication = occ_complication
        self.pc_opinion = pc_opinion
        self.accomplish = accomplish
        self.magical = magical
        self.politinfl = politinfl
        self.resource = resource
        self.intel = intel
        self.research = research

    def __str__(self):
        npc_output = "####NPC SUMMARY####\n"
        for att, val in self.__dict__.items():
            if val:
                npc_output += (f"{att} = {val}\n")
        return npc_output

# open a pickle file
# load your data back to memory when you need it
try:
    with open(npcs_pickle_file, 'rb') as fi:
        npcs = pickle.load(fi)
except FileNotFoundError as fne:
    #file doesnt exist prob first time running so create a dict with the 170 npc id's
    npcs = {id: None for id in range(npc_count)}


#select an NPC to modify / create
npc_id = None
while not npc_id:
    try:
        npc_id = int(input(f"Enter the id number of the NPC you wish to modify: "))
    except ValueError as ve:
        print("You must provide a numerical id")

    if npc_id < 0 or npc_id >= npc_count:
        npc_id = None
        print(f"you must provide a value between 0 and {npc_count}")

name = input("Enter name of NPC: ")
occupation = input("Enter NPC occupation: ")

if npcs[npc_id]:
    npc = npcs[npc_id]
    print(npc)
    modify = input("This NPC already exists do you want to continue and change them? (y/n): ")
    if modify.lower() == "y":
        npc.name = name
        npc.occupation = occupation
else:
    npcs[npc_id] = NPC(name=name, occupation=occupation)

print(npcs[npc_id])
with open(npcs_pickle_file, 'wb') as fi:
    # dump your data into the file
    pickle.dump(npcs, fi)
0 голосов
/ 08 января 2020

Я знаю, что это совсем не то, что вы просите, но не будет ли вам намного проще использовать для этого электронную таблицу?

Вы вводите данные вручную и заполняете их в любом случае, в 2D-структуру данных.
Если вам нужно использовать данные в другом месте, сохраните электронную таблицу как файл .csv и импортируйте ее.

...