Pickle变量和类用于文本冒险中的保存功能

时间:2015-05-29 22:42:40

标签: python pickle

我正在尝试在文本冒险中创建一个保存功能。 该函数必须为播放器保存一些变量和参数。

我曾试图谷歌并在论坛上提问,但我无法让它发挥作用。

整个代码在这里:http://pastebin.com/8Y3PNnRx

保存功能应将player = player('Niels', 'Knight, 0, 0, 0, 0, 0, 0, 1)(第417行)和player.goldplayer.potion等变量(第420行)保存在'C:\\Users\\XXXXX\\Desktop\\SmallDungeons\\save.dat'

位置

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

您可以使用以下方式保存:

pickle.dump((player, player.gold, player.potion), 'C:\\Users\\XXXXX\\Desktop\\SmallDungeons\\save.dat')

并加载

input2 = open('C:\\Users\\XXXXX\\Desktop\\SmallDungeons\\save.dat','r')
data = pickle.load(input2)
player = data[0]
player.gold = data[1]
player.potion = data[2]

答案 1 :(得分:0)

对于最小的示例,我们在foo.py中构建了一个类(这类似于您的类player)。

# foo.py
class Foo(object):
  def __init__(self, x):
    self.x = x
  def bar(self):
    return self.x**2

现在我们导入它,并添加一些属性(这类似于你添加player.gold),然后挑选类实例。当我们完成后,我们终止python解释器会话。

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from foo import Foo
>>> f = Foo(3)
>>> f.y = 10
>>> 
>>> import pickle
>>> with open('foobar.pkl', 'w') as pik:
...   pickle.dump(f, pik)
... 
>>> 

然后,我们重启会话,并加载pickle。

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> with open('foobar.pkl', 'r') as pik:
...   f = pickle.load(pik)
... 
>>> f.x
3
>>> f.bar()
9
>>> f.y
10
>>> 

您将看到只保存类实例,即使添加的属性(如f.y)也会被保留。这是因为pickle保留了对您的文件的引用(从哪里导入)以及任何添加的属性。你可以在pickle字符串中看到这个。

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from foo import Foo
>>> f = Foo(3)
>>> 
>>> import pickle
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(cfoo\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nI3\nsb."
>>> 
>>> f.y = 10
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(cfoo\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'y'\np6\nI10\nsS'x'\np7\nI3\nsb."

我的建议是使用pickle协议-1,因为它会使咸菜更小。您可以将此标记添加到您使用的任何地点dumpdumps

>>> pickle.dumps(f, protocol=-1)
'\x80\x02cfoo\nFoo\nq\x00)\x81q\x01}q\x02U\x01xq\x03K\x03sb.'