我目前正在开发一个程序,该程序使用具有格式数据的文件--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()方法中定义为参数的分隔符将行拆分为多个部分。在我的程序中,我使用空格作为分隔符,因为文本文件中的数据是使用空格分隔的。
我无法弄清楚为什么这个程序停止响应,我需要帮助!
答案 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有一个非常大的缓冲区,所以你只能回滚一小部分输出。