将字符串列表拆分为浮点数 - 内存错误

时间:2016-08-01 13:00:26

标签: python string split out-of-memory

我无法处理将字符串列表拆分为浮点列表。我打开一个文本文件(.vol,但它只包含文本),最后一行是一个非常长的数字行。

  

Params1 437288.59375000 102574.20312500 -83.30001831
  Params2 437871.93750000 104981.40625000 362.10000610
  Params3 0.00000000
  Params4 342 1416 262
  Params5 583.34375000 2407.19995117 445.40002441
  Params6 20.00000000
  Params7 1.70000005
  Params8 126879264
  价值观:
  0.25564435 0.462439 0.1365 0.1367 26.00000000(等等,有数百万的值)

由于它是txt文件的第10行,我将它们加载到列表中:

with open('d:/py/LAS21_test.vol') as f:
txt = []
for line in f:
    txt.append(line)

然后我尝试将其从字符串转换为浮点数:

A = []
for vx in txt[9]:
   try:
       A.append(float(vx))
   except ValueError:
       pass
print (A[0:20])
print (txt[9][0:20])

这给了我结果:

[0.0, 2.0, 5.0, 5.0, 6.0, 4.0, 4.0, 3.0, 5.0, 0.0, 4.0, 6.0, 2.0, 4.0, 3.0, 9.0, 0.0, 1.0, 3.0, 6.0]
0.25564435 0.462439 

我想要的是正确拆分的浮动列表,例如:

[0.25564435, 0.462439]

我使用except ValueError来省略空格 - 当仅使用float(txt[9])时,我得到了值错误。 第二个问题:我不能使用txt[9].split,因为那时我得到了'内存错误'。

如何正确地将其转换为浮动列表?

2 个答案:

答案 0 :(得分:0)

你的问题(如评论中所述)是:

1)在第一种情况下,你试图在拆分它之前索引字符串,并且你试图将空格转换为浮点数(因此ValueError

2)在第二种情况下,列表中可能有太多数字,并且您正在用大量字符串填充内存(因此MemoryError)。

首先尝试:

numbers = [float(s) for s in txt[9].split(' ')]

这应该会给你一个数字列表。如果这也导致MemoryError,则必须手动遍历字符串:

numbers = []
numstring = []
for s in txt[9]
    # Reached a space
    if s == ' ':
        numbers.append(float(numstring))
        numstring = []
    else:
        numstring.append(s)

这会慢很多但会节省内存。

答案 1 :(得分:0)

如果我理解正确,你不能制作txt [9] .split()并将其映射为:map(float, txt[9].split())因为txt [9]太大了。

你可以试试这个发电机:

def float_generator(txt):
        x = ''
        for c in txt:
            if c != ' ':
                x += c
            else:
                out = float(x)
                x = ''
                yield(out)

for i in float_generator(txt[9]):
        print (i)