2017-03-16 68 views
0

我有一个文件mapData.txt,其中包含多个阵列:打开文件,并创建二维数组

[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] 
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 

我将如何打开这个文件,并创建使用这些线二维数组? 例如,创建二维数组后(所谓,说,“worldMap”),如果我输入:

print(worldMap[0][0]) 

这将打印1

+0

谁决定了这个序列化格式?你的意思是*列表*而不是数组? –

+0

@ juanpa.arrivillaga我可以根据需要更改文件的格式。我认为“列表”和“阵列”是同义词? –

+0

他们不是同义词。数组是一个非常原始的数据结构。你很少直接在python中操作数组,除非你使用'numpy',其中的数组基本上都是围绕C数组的面向对象的包装器。列表实际上是一种抽象数据类型,但在Python中,列表是可调整大小的数组列表,它具有优化的操作,例如“append”和“extend”,并具有摊销的恒定时间性能。它们也是异构容器,数组通常是同质的。 –

回答

1

您应该添加错误处理代码,但是这似乎与你的例子至少工作:

import json 

worldMap = [] 
with open('mapData.txt', 'r') as datafile: 
    for line in datafile: 
     worldMap.append(json.loads(line)) 
    print(worldMap[0][0]) 
+0

完美地工作,谢谢! –

+1

@MaxHeslop如果你只是想在每一行使用'json',你可能只需从一开始就使用'json'! –

+0

@ juanpa。arrivillaga恐怕你的答案不起作用 –

0

您可以使用ast.literal_eval在评估每一行的文件或自己解析它,如下所示:

>>> def parse_line(line): 
...  return line.strip('\n[]').split(',') 
... 
>>> with open('myfile.txt') as f: 
...  world_map = [list(map(int,parse_line(line))) for line in f] 
... 
>>> pprint(world_map) 
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] 
>>> 

但你真的应该考虑使用现有的文本序列化格式,如json。因此,例如:

>>> my_list = [[1, 2, 3], [4, 5, 6]] 
>>> import json 
>>> with open('my_list.json', 'w') as f: 
...  json.dump(my_list, json) 
... 

因此,上述将json文件写入磁盘。现在,从磁盘加载:

>>> with open('my_list.json') as f: 
...  list2 = json.load(f) 
... 
>>> list2 
[[1, 2, 3], [4, 5, 6]] 
>>> 
+0

@Kasramvd什么? –

+0

我得到了错误“ValueError:无效文字为int()与基10:'1]'” –

+0

对不起,我被术语'ast.literal_eval'弄糊涂了。但是,这仍然没有效率,至少为每一行使用'ast.literal_eval'。 – Kasramvd

1

作为一个简单的,所以有效的方法,你可以使用numpy.genfromtxt

import numpy as np 

a = np.genfromtxt('a.txt', delimiter=',') 
+0

是的,但是这需要'numpy',这不完全是一个库,您只需要一个方便的方法来加载阵列。另外,这不适用于括号。 –

+1

@ juanpa.arrivillaga无所谓它需要什么。 Numpy是一个类似于另一个Python内置库的库,你只需要像Cpython解释器一样安装它。唯一重要的是什么是正确的,然后更好,在这种情况下,除了以最优化的方式加载文本之外,它还将返回一个numpy数组,这对未来的操作也有很多好处。 (它也可以鼓励OP学习新的东西,适合他/她的需求) – Kasramvd

+0

'numpy' * *不像内置库。这是一个第三方库,安装并不总是微不足道 - 尤其是在非Unix平台上。在这种情况下,我们无法确定'numpy'数组或者'香草python'list是否可取。然而,我们可以推测OP正在为一个类似游戏的小项目编写某种世界地图。这肯定不*听起来像'numpy'的用例,特别是如果你的列表列表是16x16 ...对于这样的小结构'numpy'可能比普通python慢​​。 –