处理大文件时创建数组

时间:2011-10-17 04:36:50

标签: python

这是我的第一篇文章,尽管我已经读了一段时间了。 我是Python初学者,我需要你的帮助。 我正在处理一个非常大的文件(超过200万行),但我会向你展示一个更小的例子(24行而不是74513)。所以,假设我有24行,每行有一个浮点数,在同一行上有3个数字,然后是24行,有3个数字,依此类推29次。

56.71739
56.67950
56.65762
56.63320
56.61648
56.60323
56.63215
56.74365
56.98378
57.34681
57.78903
58.27959
58.81514
59.38853
59.98271
60.58515
-1.00000
56.09566
56.05496
56.02777
56.00158
55.98341
55.96830
55.99615
          1            1          1
56.34692
56.70977
57.15187
57.64234
58.17782
58.75118
59.34534
59.94779
-1.00000
55.47366
55.42963
55.39739
55.36958
55.35020
55.33404
55.36098
55.47148
55.71110
56.07384
56.51588
57.00632
57.54180
58.11517
58.70937
         2            1           1

使用前24行创建数组非常容易:

import numpy

def ttarray_tms (traveltimes):
    '''It defines the 3-D array, organized as I want.'''
    with open (traveltimes, 'r') as file_in:
        newarray = file_in.readlines()
        ttarray = np.array(newarray)
        ttarray.shape = (2,3,4)
        ttarray = np.swapaxes(ttarray,1,2)
        ttarray = np.swapaxes(ttarray,0,2)
        return ttarray

请注意:每个号码之间没有空行。这是一个简单的冒号矢量文件。出于某种原因,我不得不这样发帖。 我想要的是基本上得到29个数组,所以我应该遍历24行并得到一个数组,然后在接下来的24行再次循环(用3个数字跳线,我真的不需要它们)然后得到另一个数组等。我认为我的主要问题是如何跳过3个数字的行,然后重新开始新数组的循环。

你有什么好主意吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

您可以使用readline()一次读取一行,然后使用另一个readline()跳过一行,依此类推。

使用您的代码:

import numpy

def mk_array(elems):
    '''Makes the nparray from an array of 24 numbers'''
    ttarray = np.array(elems) # perhaps [ float(a) for a in elems ] is needed
    ttarray.shape = (2,3,4)
    ttarray = np.swapaxes(ttarray,1,2)
    ttarray = np.swapaxes(ttarray,0,2)
    return ttarray

def ttarray_tms(traveltimes):
    '''It defines the 3-D array, organized as I want.'''
    arrays = list()
    with open (traveltimes, 'r') as file_in:
        ret = "." # force the loop
        while ret != "":
            newarray = [ file_in.readline() for i in range(24) ]
            ret = file_in.realine()
            if ret != "": # avoid an empty array
                ttarray = mk_array(newarray)
                arrays.append(ttarray)       
    return arrays

未经测试。

答案 1 :(得分:0)

三个设定行中的数字遵循递增模式。那么,为什么不通过将最后两个数字保存在两个变量中来跟踪该模式,如果三个对应于模式,则将它们丢弃并继续?这是一种滑动窗口方法。