Как сохранить / загрузить данные с полки, используя цикл «for»? - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь использовать полку для сохранения / загрузки некоторых данных в / из файла.У меня есть список словарей:

inv = [slot0, slot1, slot2, slot3, slot4, slot5, slot6]

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

slot0 = {"item_pos": [hud_x + 592, hud_y + 4], "text_pos": [hud_x + 612, hud_y + 25], "item": None, "amount": 0}

ВДля сохранения / загрузки словарей я использую модуль «полка», а вот код для сохранения:

with shelve.open((os.path.join(saves_path, "inventory", "inventory")), "c") as f:

        f["slot0_item"] = slot0["item"]
        f["slot0_amount"] = slot0["amount"]
        f["slot1_item"] = slot1["item"]
        f["slot1_amount"] = slot1["amount"]
        f["slot2_item"] = slot2["item"]
        f["slot2_amount"] = slot2["amount"]
        f["slot3_item"] = slot3["item"]
        f["slot3_amount"] = slot3["amount"]
        f["slot4_item"] = slot4["item"]
        f["slot4_amount"] = slot4["amount"]
        f["slot5_item"] = slot5["item"]
        f["slot5_amount"] = slot5["amount"]
        f["slot6_item"] = slot6["item"]
        f["slot6_amount"] = slot6["amount"]

Вот код для загрузки:

with shelve.open((os.path.join(saves_path, "inventory", "inventory")), "c") as f:

        slot0["item"] = f["slot0_item"]
        slot0["amount"] = f["slot0_amount"]
        slot1["item"] = f["slot1_item"]
        slot1["amount"] = f["slot1_amount"]
        slot2["item"] = f["slot2_item"]
        slot2["amount"] = f["slot2_amount"]
        slot3["item"] = f["slot3_item"]
        slot3["amount"] = f["slot3_amount"]
        slot4["item"] = f["slot4_item"]
        slot4["amount"] = f["slot4_amount"]
        slot5["item"] = f["slot5_item"]
        slot5["amount"] = f["slot5_amount"]
        slot6["item"] = f["slot6_item"]
        slot6["amount"] = f["slot6_amount"]

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

for slot in inv:
            f["slot_item"] = slot["item"]
            f["slot_amount"] = slot["amount"]

... И загрузить данные следующим образом:

for slot in inv:
            slot["item"] = f["slot_item"]
            slot["amount"] = f["slot_amount"]

Однако, когда я использую этометод, словари не сохраняют / загружают свои изменения при перезапуске программы, как они должны.Как я могу (если это возможно) правильно использовать цикл for для эффективного сохранения / загрузки данных с полки?

РЕДАКТИРОВАТЬ: hud_x и hud_y оба равны 20

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Я решил вместо этого использовать pickle, поскольку он легче работает с циклами for.Кроме того, shelve использует словарь-синтаксис (pickle - нет), так что это может быть частью проблемы.

Сохранение:

with open((os.path.join(saves_path, "inventory", "inventory.txt")), "wb") as f:
        for slot in inv:
            pickle.dump(slot["item"], f)
            pickle.dump(slot["amount"], f)

Загрузка:

with open((os.path.join(saves_path, "inventory", "inventory.txt")), "rb") as f:
        for slot in self.inventory.inv:
            slot["item"] = pickle.load(f)
            slot["amount"] = pickle.load(f)
0 голосов
/ 09 июня 2018

Если вам удастся иметь код или список вместо кода slot1, slot2 и т. Д., Это может быть намного проще.

import json
from pathlib import Path
import random

# repliacting some data 
def generate_dict():
   return {"item_pos": [rnd() + 592, rnd() + 4], 
           "text_pos": [rnd() + 612, rnd() + 25], 
           "item": None, 
           "amount": 0}

def rnd():
   return random.randint(0, 1000)    

# change of data structure
dict_list = [generate_dict() for id in range(7)]

# easily seriliasable into json
json_str = json.dumps(dict_list, sort_keys=True, indent=4)

# you can save json as file 
Path('store.json').write_text(json_str)

# read back
assert json.loads(Path('store.json').read_text()) == dict_list
...