ваша проблема - ваше понимание того, как работают переменные и назначения. В приведенном ниже коде вы делаете много списков. Затем вы создаете переменную с именем 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)