【问题标题】:Import a list from a file, into a list [duplicate]将文件中的列表导入列表[重复]
【发布时间】:2015-05-30 11:27:12
【问题描述】:

我正在用 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 在保存文件“saveGame.dat”中保存为['Blink']

这是我尝试过的:

我已将该列表导入到名为 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
'
]

所以,我的问题是:我将如何将一个列表从一个文件导入另一个列表 - 但将单词添加到列表中,而不是单个字符?

任何帮助表示赞赏。

【问题讨论】:

  • 你最好使用例如pickle 保存实际对象,而不是将它们全部写成文本表示。唯一的缺点是该文件不是人类可读的。
  • @jonrsharpe 我读到了pickle,并考虑过使用它,但目前我正在修复保存文件,它们需要可读,所以我可以调整一些东西!如果我对它们进行排序,我可以使用pickle
  • 您也可以使用 JSON。像泡菜和人类可读的作品。当然可以用其他所有语言阅读。
  • 很公平。看起来你真的可以用一个类来存储所有这些相关的变量,你也可以使用 pickle 来存储和重新创建。

标签: python python-3.x


【解决方案1】:

['Blink'] 被读取为字符串。您可以评估字符串以获取 Python 列表:

import ast

playerSpells_list = ast.literal_eval(playerSpells)

还有内置的eval()。请参阅 this question 了解为什么 ast 更好。

【讨论】:

  • 像魅力一样工作。非常感谢!我会尽快接受答案。
【解决方案2】:

使用playerSpells = importedData[5],您在 playerSpells 变量中存储了一个字符串,而不是一个列表。由于 Python 不是强类型的,所以它不会抱怨。但是,当您迭代字符串时,您会在每次迭代中得到一个字符,然后将其打印出来。

解决这个问题的方法是使用

import ast
playerSpells = ast.literal_eval(importedData[5])

但是有更好的解决方案。您在这里所做的称为反序列化,即将字符串转换回最初序列化的数据结构。在 Python 中有很多方法可以很好地做到这一点。

我建议您查看pickle module,它是用 Python 专门为此任务构建的,或者使用 JSON(JavaScript Object Notation 的缩写),这是一种普遍接受的存储数据结构的方式,并且适用于大多数语言. Python 也有一个module 来处理它。

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 2017-04-23
    • 1970-01-01
    • 2022-01-03
    • 2013-09-19
    • 2016-10-03
    • 2023-03-17
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多