在Python中读取具有不同列数的大型文件的最快方法

2024-03-28 19:38:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在文件data.txt中有一个浮点数数据集,其中每行包含可变的列数。例如:

    3.0 2.5
    1.1 30.2 11.5
    5.0 6.2
    12.2 70.2 14.7 3.2 1.1

为了阅读它,我可以很容易地在Matlab中使用fopenfscanf的组合。最后一个按列顺序读取数据并将其转换为数组,如下所示:

    array = [3.0 2.5 1.1 30.2 11.5 5.0 6.2 12.2 70.2 14.7 3.2 1.1]'

我想把我的Matlab代码翻译成Python。但是,由于没有Python内置函数来替代Matlab的fscanf,因此我编写了以下Python代码,以与前面描述的相同的方式读取和重新塑造数据:

    from numpy import *

    data = []
    with open('data.txt') as file:
       for line in file:
          cline = line.split()
          data = data + cline

    data = array(data)

这是可行的,但是我的一些数据集最多可以有200000行,而且我展示的Python代码对于大型数据集的读取非常慢(大约10分钟)。另一方面,Matlab的fscanf只需几秒钟或更短的时间就能完成这项工作。那么,在Python中有没有比我的代码更快(优化)的方法呢?你知道吗

如果有任何建议,我将不胜感激。你知道吗


Tags: 文件数据代码txtdata顺序linearray
3条回答

Pandas在处理不规则的列方面比numpy好/快得多,而且应该比普通的带循环的python实现快。你知道吗

使用read_csv,后跟stack,然后访问values属性以返回numpy数组。你知道吗

max_per_row = 10 # set this to the max possible number of elements in a row

vals = pd.read_csv(buf, header=None, names=range(max_per_row),
                             delim_whitespace=True).stack().values

print(vals)
array([  3. ,   2.5,   1.1,  30.2,  11.5,   5. ,   6.2,  12.2,  70.2,
        14.7,   3.2,   1.1])

numpy.loadtxt在这里是完美的,但在这里不适用,因为列的数量会改变。你知道吗

如果你想要一个简单的列表,你可以通过使用列表来加快它的速度:

from numpy import *
with open("file.txt") as f:
    data = array([float(x) for l in f for x in l.split()])

(现在我很肯定,考虑到JH在回答中指出的错误,它会更快:data = data + line每次都创建一个新的列表:二次复杂性。您可以通过列表压缩来避免这种情况)

排了几千行之后,这就需要做很多额外的工作:

    data = data + cline

只是data.extend(cline)。(或者.append(),如果您想知道哪些数字同时出现在一行上。)

考虑存储双精度而不是文本:

    data.extend([float(c) for c in line.split()])

相关问题 更多 >