使用python进行大量文件处理和排序

时间:2015-05-29 16:27:46

标签: python file-handling

我目前正在开发一个程序,该程序使用具有格式数据的文件--6列和动态编号。行。

我测试的文件是26 MB,以下是将前3列转换为3个不同列表的程序。

f = open('foo', 'r')
print('running...')
a = []
b = []
c = []
for line in f:
    x = (line.split(' '))
    a.append(x[0])
    b.append(x[1])
    c.append(x[2])
print(a,b,c,sep='\n')

我已经重新检查了这个程序并且逻辑看起来是正确的,当在小文件上实现时它可以工作但是当我使用这个程序和26 mb文件时它停止响应。

该计划的描述: 该程序打开文件名'foo'并逐行实现该文件。 它根据在.split()方法中定义为参数的分隔符将行拆分为多个部分。在我的程序中,我使用空格作为分隔符,因为文本文件中的数据是使用空格分隔的。

我无法弄清楚为什么这个程序停止响应,我需要帮助!

2 个答案:

答案 0 :(得分:1)

如果您使用numpy,则可以使用genfromtxt

import numpy as np

a,b,c=np.genfromtxt('foo',usecols=[0,1,2],unpack=True)

这适用于您的大文件吗?

编辑:

好的,所以我在你的文件上试了一下,看起来效果很好。所以我不确定你的问题是什么。

In [1]: from numpy import genfromtxt

In [2]: a,b,c=genfromtxt('foo',usecols=[0,1,2],unpack=True)

In [3]: a
Out[3]: 
array([ 406.954744,  406.828508,  406.906079, ...,  408.944226,
        408.833872,  408.788698])

In [4]: b
Out[4]: 
array([ 261.445358,  261.454366,  261.602131, ...,  260.46189 ,
        260.252377,  260.650606])

In [5]: c
Out[5]: 
array([ 17.451789,  17.582017,  17.388673, ...,  26.41099 ,  26.481148,
        26.606282])

In [6]: print len(a), len(b), len(c)
419040 419040 419040

答案 1 :(得分:1)

我查看了文件,它是419,041行,而不是150行。我在文件的一个子集上测试了我自己的算法,我估计整个过程大约需要40秒。

这是我使用的算法:

with open('foo', 'r') as f:
        a, b, c, d, e, f = zip(*(map(float, line.split()) for line in f))

这会为每列中的数字创建tuple,将它们从字符串转换为float s。

然后我在同一个小文件上测试了你的算法,发现它花了差不多两倍的时间。您可能需要等待一两分钟(取决于计算机的性能)才能完成文件处理。由于在完成之前没有输出,它看起来就像是冻结了。我也不建议最后打印所有结果,因为1)这将花费很长时间,2)它所做的只是以更杂乱的方式重新打印文件,以及3)大多数命令行终端“ t有一个非常大的缓冲区,所以你只能回滚一小部分输出。