从文本文件创建数组
我刚开始学Python,遇到了一些问题。
我有一些测量数据保存在一个txt文件里。
这些数据是用制表符分开的,结构如下:
0 0 -11.007001 -14.222319 2.336769
每次模拟我都有32个数据点(0,1,2,...,31),而我有300次模拟(0,1,2,...,299),所以数据最开始是按模拟次数排序的,然后是数据点的编号。
第一列是模拟的编号,第二列是数据点的编号,后面三列是x、y、z坐标。
我想创建一个三维数组,第一维是模拟的编号,第二维是数据点的编号,第三维是三个坐标。
我已经开始了一些工作,以下是我目前的进展:
## read file
coords = [x.split('\t') for x in
open(f,'r').read().replace('\r','')[:-1].split('\n')]
## extract the information you want
simnum = [int(x[0]) for x in coords]
npts = [int(x[1]) for x in coords]
xyz = array([map(float,x[2:]) for x in coords])
但是我不知道怎么把这两个列表和这个数组结合起来。
最后我想得到这样的结构:
array = [simnum][num_dat_point][xyz]
谢谢你的帮助。
希望你能理解我的问题,这是我第一次在Python论坛发帖,如果我做错了什么,我很抱歉。
再次感谢!
7 个回答
2
你可以用 zip
函数 把它们结合起来,像这样:
for sim, datapoint, x, y, z in zip(simnum, npts, *xyz):
# do your thing
或者你也可以完全不使用列表推导式,直接遍历文件的每一行:
for line in open(fname):
lst = line.split('\t')
sim, datapoint = int(lst[0]), int(lst[1])
x, y, z = [float(i) for i in lst[2:]]
# do your thing
要解析一行内容,你可以(而且应该)这样做:
coords = [x.split('\t') for x in open(fname)]
2
这看起来是个很好的机会,可以使用itertools.groupby这个工具。
import itertools
import csv
file = open("data.txt")
reader = csv.reader(file, delimiter='\t')
result = []
for simnumberStr, rows in itertools.groupby(reader, key=lambda t: t[0]):
simData = []
for row in rows:
simData.append([float(v) for v in row[2:]])
result.append(simData)
file.close()
这段代码会创建一个名为'result'的三维列表。第一个索引代表模拟的编号,第二个索引代表在这个模拟中的数据编号。每个值是一个包含x、y和z坐标的整数列表。
需要注意的是,这段代码假设数据已经按照模拟编号和数据编号进行了排序。
2
根据Python的设计理念,简单的结构比复杂的结构更好。我建议直接使用字典。
import csv
f = csv.reader(open('thefile.csv'), delimiter='\t',
quoting=csv.QUOTE_NONNUMERIC)
result = {}
for simn, dpoint, c1, c2, c3 in f:
result[simn, dpoint] = c1, c2, c3
# pretty-prints the result:
from pprint import pprint
pprint(result)