我如何在Python中将数据保存到/从文本文件加载为变量?
我正在使用Python 2.7.8,想要编写一个简单的文本游戏。为了让它运行得更好,我希望能把一些变量保存到一个文本文件里,然后下次运行程序时再把它们读回来,变成变量。理想情况下,我希望每个变量单独占一行,但我不太确定怎么做到这一点。编辑:这是我相关的代码:
https://gist.github.com/anonymous/3a14fcd68b0045b2c0c0
不知道为什么,代码在启动时崩溃了。抱歉,我对Python还不太熟悉。总之,有没有更好的方法把这些信息写入文件?另外,我可以用什么方法从那个文件中读取一个变量,并把它存储为游戏中的变量呢?
编辑:我现在学到了一些非常有用的东西,可以帮助我调试。当代码运行时,终端显示了这些信息:
https://gist.github.com/anonymous/bfc085d8d1d0b7969574
非常感谢。
3 个回答
有很多方法可以做到这一点!比如ConfigParser、shelve、sqlite、pickle等等。
我会从一个非常简单的开始。例如,创建两个函数“get_value(name)”和“set_value(name, value)”,像这样:
import os
import time
#######
def get_value(name):
name += '.cfg'
if not os.path.exists(name):
return ''
with open(name) as f:
return f.read()
def set_value(name, value):
name += '.cfg'
with open(name, 'w') as f:
f.write(value)
#######
if __name__ == "__main__":
countryname = get_value('countryname')
if not countryname:
countryname = raw_input("What will your country be called? ")
set_value('countryname', countryname)
print "Welcome to %s!" % countryname
time.sleep(0.5)
这样每个值都会创建一个文件。如果这样管理起来太麻烦,我会改用JSON格式。
下面是它的实际应用:
$ python game.py
What will your country be called? Steveland
Welcome to Steveland!
# it remembers my answer
$ python game.py
Welcome to Steveland!
$ ls *.cfg
countryname.cfg
# reset my answer
$ rm countryname.cfg
$ python game.py
What will your country be called? Stevesylvania
Welcome to Stevesylvania!
解决这个问题最可靠的方法是使用 pickle
来存储你想要保存的数据:https://docs.python.org/2/library/pickle.html
简单来说,Pickle 就是把一个对象变成一个字符串。之后你可以通过“反序列化”这个字符串,把对象再拿出来。
如果你的数据比较简单,并且你希望能手动查看和修改它,那么使用 Pickle 可能会显得有些复杂。在这种情况下,我强烈推荐使用 XML 或 JSON 作为数据存储格式。这些格式灵活,可以表示像哈希表和列表这样的结构,而一些更简单的格式(包括你自己可能定义的大多数格式)就做不到这一点。
使用ConfigParser这个例子,你可以这样创建你的“存档文件”:
import ConfigParser
countryName = raw_input("What will your country be called? ")
config = ConfigParser.RawConfigParser()
config.add_section('Countries')
config.set('Countries', 'MyCountry', countryName)
with open('save.txt', 'wb') as saveFile:
config.write(saveFile)
运行这个代码后,会生成一个名为“save.txt”的文件,你可以用下面的方式来读取它:
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read('save.txt')
countryName = config.get('Countries', 'MyCountry')