簡體   English   中英

沒有從腌制的文件中加載

[英]Not loading from pickled file

我在macOS Sierra上運行Python 3.5。 我有一個系統,其中將類的實例作為列表存儲在文件中(使用dill ),然后解開它們以執行操作,添加到它們,刪除它們等。問題是,當我設置localData列表(加載的類的列表)到從文件加載的數據中,我無法與之交互。


這是我的代碼:

import dill as pickle


...


dataFileLocation = "./data.ehd"
localData = []


class eventClass:
    def __init__(self, name, items, organisers):
        self.name       =   name
        self.items      =   items
        self.organisers =   organisers
        loadData()
        self.id         =   len(localData)

def loadData():
    try:
        dataFile            =   open(dataFileLocation, "rb")
        localData           =   pickle.load(dataFile)
        return localData
    except (IOError, EOFError):
        return False


def newEvent(name, items, organisers):
    loadData()
    localData.append(eventClass(name, items, organisers))
    with open(dataFileLocation, "wb+") as dataFile:
        pickle.dump(localData, dataFile)


...


def getInfo(name):
    loadData()
    for event in localData:
        if event.name == name:
            organisers      =   ""
            for organiser in event.organisers:
                organisers  =   (organisers + ", " + str(organiser))
            items = ""
            for item in event.items:
                items       =   (items + ", " + str(item))
            items           =   items[2:]
            organisers      =   organisers[2:]
            print("Name:        " + str(event.name))
            print("Internal ID: " + str(event.id))
            print("Items:       " + items)
            print("Organisers:  " + organisers)


def prompt():
    task = input("EventHorizon >")
    execute(task)
    prompt()


def execute(task):
    task                    =   task.lower().split(" ")
    if task[0] == ("newevent"):
        name                =   task[1]
        items               =   task[2].split(":")
        organisers          =   task[3].split(":")
        newEvent(name, items, organisers)
    elif task[0] == ("dropevent"):
        name                =   task[1]
        dropEvent(name)
    elif task[0] == ("getinfo"):
        name                =   task[1]
        getInfo(name)
    elif task[0] == ("quit") or task[0] == ("exit"):
        quit()
    elif task[0] == ("loaddata"):
        loadData()




loadData()
prompt()


這是我正在做的事情(從一個空白的data.ehd開始):

bash-3.2$ python3 main.py
EventHorizon >newEvent myEvent myItem myOrganiser
EventHorizon >newEvent myEvent2 myItem2 myOrganiser2
EventHorizon >getInfo myEvent
Name:           myevent
Internal ID:    0
Items:          myitem
Organisers:     myorganiser
EventHorizon >getInfo myEvent2
Name:           myevent2
Internal ID:    1
Items:          myitem2
Organisers:     myorganiser2
EventHorizon >exit
bash-3.2$ python3 main.py
EventHorizon >loadData
EventHorizon >getInfo myEvent
EventHorizon >getInfo myEvent2

沒有輸出顯示事件的屬性。 我還從一個確實包含數據的data.ehd文件開始進行了測試(將其寫入可以正常工作)。

為什么會這樣呢? 任何幫助將不勝感激。 謝謝!

感謝@ juanpa.arrivillaga,此問題已解決!

問題在於loadData中的localData變量僅是本地的,因此主代碼中的localData未被更新。

通過在開始時修改loadData來將localData定義為global來解決此問題。 修改后的loadData為:

def loadData():
    global localData
    try:
        dataFile            =   open(dataFileLocation, "rb")
        localData           =   pickle.load(dataFile)
    except (IOError, EOFError):
        return False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM