Python:如何读取列数不均匀的数据文件

时间:2012-03-22 13:15:59

标签: python file numpy

我的一个朋友需要阅读大量令人讨厌的数据(大约18000个数据集)。具体来说,数据应该是8列和~8000行数据,而是数据以7列的形式传递,最后一个条目溢出到下一行的第一列。

另外每30行只有4列。这是因为某些上游程序正在将一个200 x 280阵列重新整形为7x8120阵列。

我的问题是:我们如何将数据读入8x7000阵列。当列数不均匀时,我通常的np.loadtxt和np.genfromtxt库都会失败。

请记住,性能是一个因素,因为必须为~18000个数据文件完成。

以下是典型数据文件的链接: http://users-phys.au.dk/hha07/hk_L1.ref

3 个答案:

答案 0 :(得分:11)

我想到的更简单的方法:

with open("hk_L1.ref") as f:
    data = numpy.array(f.read().split(), dtype=float).reshape(7000, 8)

首先将数据读取为一维数组,完全忽略所有换行符,然后将其重新整形为所需的形状。

虽然我认为该任务无论如何都会受I / O限制,但如果重要的话,这种方法应该使用很少的处理器时间。

答案 1 :(得分:1)

如果我理解正确(请参阅我的评论),您可以将您的输入拆分为令牌,然后将其以八个为单位进行处理:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

f = open('filename.ref')
tokens = f.read().split()

rows = []
for idx, token in enumerate(tokens):
    if idx % 8 == 0:
        # this is a new row, use a new list.
        row = []
        rows.append(row)
    row.append(token)

# rows is now a list of lists with the desired data.

这在我的电脑中按原样在0.2秒内运行。

编辑:使用@ SvenMarnach的建议。

答案 2 :(得分:0)

这个怎么样?

data = []
curRow = []
dataPerRow = 8
for row in FILE.readlines():
    for item in row.split():
         if len(curRow) == dataPerRow:
             data.append(curRow)
             curRow = []
         curRow.Append(item)

data.append(curRow)

(假设FILE是正在读入的文件) 然后你有一个列表列表,可以用于任何目的。