我在Python中编写一个使用保存文件功能的游戏。我编写了一个函数,将所有必要的变量,字符串,列表和字典保存到文件中。总而言之,当我调用一个名为" load()"的函数时,有11件事需要导入。我写的。
这是load():
def load():
importedData = open("saveGame.dat", "r+").readlines()
for x in range(0,len(importedData)):
position = importedData[0]
health = importedData[1]
strength = importedData[2]
exp = importedData[3]
playerLevel = importedData[4]
# playerSpells = []
# spellsFromSaveFile = importedData[5]
# This doesn't work!
playerClass = importedData[6]
seenDialogues = importedData[7]
rank = importedData[8]
playerItems = importedData[9]
itemDesc = importedData[10]
specialItems = importedData[11]
return position, health, strength, exp, playerLevel, playerSpells, playerClass, seenDialogues, rank, playerItems, itemDesc, specialItems
以下是保存文件的样子:
2
24
4
96
1
['Blink']
None
2
Frajan
[]
{}
{}
大多数词典和列表都是空白的,因为它们用于游戏中稍后拾取的项目(此保存文件是在游戏的早期创建的)。
虽然我需要导入几个列表和词典,但我会关注其中一个。列表playerSpells
在保存文件中保存为['Blink']
," saveGame.dat"。
以下是我尝试的内容:
我已将列表导入名为playerSpells
的列表:
playerSpells = []
playerSpells = importedData[5]
print(playerSpells)
第print(playerSpells)
行返回:
['Blink']
这看起来很有效,所以我添加了以下循环:
playerSpells = []
playerSpells = importedData[5]
for x in range(0,len(playerSpells)):
print(playerSpells[x])
但得到了这个:
[
'
B
l
i
n
k
'
]
所以,我的问题是:我如何将列表从文件导入另一个列表 - 但是在列表中添加单词而不是单个字符?
任何帮助表示感谢。
答案 0 :(得分:2)
['Blink']
被读作字符串。您可以评估字符串以获取Python列表:
import ast
playerSpells_list = ast.literal_eval(playerSpells)
还有内置的eval()
。有关ast
更好的原因,请参阅this question。
答案 1 :(得分:2)
使用playerSpells = importedData[5]
,您在playerSpells变量中存储了一个字符串,而不是列表。由于Python没有强类型,因此不会抱怨。但是,当您遍历字符串时,每次迭代都会得到一个字符,然后打印出来。
对此的肮脏修复是使用
import ast
playerSpells = ast.literal_eval(importedData[5])
然而,有更好的解决方案。你在这里做的是被称为反序列化,即将字符串转换回最初序列化的数据结构。有很多方法可以在Python中很好地完成这项工作。
我建议你查看pickle module,它是专门为Python中的这个任务构建的,或者使用JSON(JavaScript Object Notation的简称),这是一种普遍接受的存储数据结构的方法,并且可以很好地与大多数语言。 Python也有module来处理它。