【问题标题】:Opening a list from a file从文件中打开列表
【发布时间】:2016-01-31 13:37:15
【问题描述】:

我正在使用 pygame 创建我的第一个“游戏”,并想添加一个加载文件选项。我的代码是:

file = input('What save file should be opened? ')
file = file + '.txt'
file = open(file, 'r')
tilemap = file.read()

这很好,直到我到达这一行

SCREEN.blit(textures[tilemap[row][column]], (column*TILESIZE, row*TILESIZE))

我在哪里得到一个 KeyError:'['

这是因为我打开的文件是一个数字列表,但它作为字符串打开 - 程序将“[”作为字符串的一部分读取。我试过使用:

tilemap = file.readlines()

但这给出了一个列表,里面有一个字符串。我在互联网上看到的所有内容都是将字符串或整数放入列表中,而不仅仅是打开列表。如何打开列表??

编辑:

文件(.txt)是列表的列表,如:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

【问题讨论】:

  • 将字符串转换为数字...
  • 我猜你的存档只是一个整数列表。那是对的吗? SCREEN.blit(textures[tilemap[row][column]], ... 需要一个数字列表列表,因此您需要将文件数据转换为该表单。为了正确地做到这一点,我们需要知道你的保存文件的确切格式,所以如果你可以在你的问题。
  • 您能指定文件的确切格式吗?它是 Python 列表的字符串表示,例如“[1,2,3]”作为一行?
  • 文件为列表列表,如:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • json.load? ast.literal_eval?

标签: python list file python-3.x pygame


【解决方案1】:

如您所见,somefile.read 返回一个字符串,其中包含一个表达式。要将表达式转换为您想要的结构,您必须以某种方式对其进行评估。 GingerPlusPlus 提供了两种比使用eval 更安全的方法。举例说明:

import ast, json

data ='[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'
for func in (ast.literal_eval, json.loads):
    ob = func(data)
    print(type(ob), ob)

打印

<class 'list'> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
<class 'list'> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

对于更复杂的表达式,Python 和 Javascript(JavaScript Object Notation 的来源)的确切语法不同。

【讨论】:

  • 你能解释一下这里发生了什么吗,我很新,以前没有使用过 ast 或 json。
  • 两者都像eval一样编译并执行字符串中包含的表达式以获取其他Python对象。 ast.literal_eval 我们是eval 的受限版本。在将表达式解析为 ast(抽象语法树,请阅读文档)之后,但在编译 ast 之前,会检查 ast 以确保表达式是广义上的“文字”。没有变量,只有常量,只有没有副作用的安全操作。
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多