从文本文件创建数组

3 投票
7 回答
7907 浏览
提问于 2025-04-15 13:30

我刚开始学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)

撰写回答