4

我试图创建不同的对象(使用类和对象)并将它们保存在文件中以便以后编辑或检索它们。然而,这看起来如何。

GlobalCategories=[]
GlobalContent=[]
def LoadData(x,y):
   import pickle
   with open('bin.dat') as f:
       x,y = pickle.load(f)


def SaveData(x,y):
   import pickle
   with open('bin.dat', 'wb') as f:
      pickle.dump([x,y], f)

def Loader(x,y):
     try:
          LoadData(x,y)
     except:
          SaveData(x,y)

这个保存的片段显示了我如何保存列表中的信息(tema 是类,其他东西是该类的方法):

newtheme=Tema()
newtheme.setInfo_name(newstr)
newtheme.setInfo_code(newcode)
GlobalCategories.append(newtheme)
SaveData(GlobalContent,GlobalCategories)

X 和 Y 是我存储对象的全局列表。(我注意到它在每个对象的内存中保存方向)当我第一次运行它时,它会创建文件并将信息保存在文件中,但是如果我关闭它,尝试再次运行它并加载信息,程序删除信息,并再次创建文件,因此存储的任何内容都消失了。

我不知道这是否是存储对象的正确方法,或者是否有更好的方法,因此非常欢迎任何建议。

@abernert:谢谢阿巴纳特!我想要做的是保存一个包含两个列表的列表。例如,一个列表将保存品牌(丰田、尼桑等),另一个列表将保存汽车模型(苔原、穆拉诺)。现在每个元素都是一个对象,我在创建时添加到列表中。 newtheme=Theme() newtheme.setInfo_name(newstr) GlobalCategories.append(newtheme) 这就是我将对象保存在全局列表中的方式。GlobalCategories 是我在关闭程序后想要加载的两个列表之一(它就像示例中的汽车公司列表)。现在,我遇到的问题是在我关闭并重新启动程序后从列表中加载对象,因为当我没有关闭 shell 时,我能够从列表中检索和编辑它们。启动程序后,我需要将品牌和汽车对象加载并存储在相应的列表中,以便以后对其进行操作。再次感谢阿伯纳特!

4

2 回答 2

7

LoadData如果没有您如何尝试使用您的和SaveData功能的上下文,很难知道问题出在哪里。但是,这里有一个小演示,可以满足我的要求。

import pickle
import random

def load_data():
    try:
        with open("bin.dat") as f:
            x, y = pickle.load(f)
    except:
        x, y = [], []
    return x, y

def save_data(data):
    with open("bin.dat", "wb") as f:
        pickle.dump(data, f)

if __name__ == "__main__":
    x, y = load_data()
    print x, y
    x.append(random.randint(1, 10))
    y.append(random.randint(1, 10))
    save_data([x, y])

连续运行的输出

[] []
[9] [9]
[9, 10] [9, 9]
[9, 10, 2] [9, 9, 4]
[9, 10, 2, 5] [9, 9, 4, 1]
[9, 10, 2, 5, 6] [9, 9, 4, 1, 9]
[9, 10, 2, 5, 6, 10] [9, 9, 4, 1, 9, 1]
于 2013-06-12T23:17:28.993 回答
0

很难确定,但我猜您的问题是您正在编写一个二进制文件,然后尝试将其作为文本读回,并且您在 Windows 上使用的是 Python 2.x。

在这段代码中:

def LoadData(x,y):
    import pickle
    with open('bin.dat') as f:
        x,y = pickle.load(f)

如果您在二进制 pickle 流中碰巧有任何 LF 换行符,则以文本形式打开文件会将它们转换为 CR/LF 对。这将导致泡菜无效,因此会引发异常。

在这段代码中:

def Loader(x,y):
     try:
          LoadData(x,y)
     except:
          SaveData(x,y)

…您只需吞下任何异常并保存一些空值。

您可能只想在此处处理 file-not-found 错误(IOErrorOSErrorFileNotFoundError,具体取决于您的 Python 版本)。

但是您肯定希望将异常放入变量中以帮助调试您的问题,如下所示:

def Loader(x,y):
     try:
          LoadData(x,y)
     except Exception as e:
          SaveData(x,y)

您可以在调试器的行上放置一个断点SaveData,或者只是添加print(e)一行并观察输出,以了解您到达那里的原因。


同时,即使您解决了这个问题,LoadData也永远不会做任何有用的事情。赋值x,y = pickle.load(f)只是重新绑定局部变量xy. 它们与 in 的局部变量具有相同名称的事实Loader并不意味着Loader's 的变量会发生变化。他们过去引用相同的值的事实也没有。

Python 没有“参考变量”或“输出参数”。执行此操作的正常方法是仅返回要传递回调用者的值:

def LoadData():
    import pickle
    with open('bin.dat') as f:
        x,y = pickle.load(f)
    return x,y

当然Loader必须正确调用它:

def Loader(x,y):
     try:
          x,y = LoadData()
     except:
          SaveData(x,y)

并且您在 中再次遇到完全相同的问题Loader,因此您需要在其中再次修复它,并在它的调用者中修复它。

于 2013-06-12T23:45:56.047 回答