使用python从文件中提取浮点数

时间:2015-02-19 12:22:24

标签: python

我的.txt文件看起来像:

[ -5.44339373e+00  -2.77404404e-01   1.26122094e-01   9.83589873e-01
   1.95201179e-01  -4.49866890e-01  -2.06423297e-01   1.04780491e+00]
 [  4.34562117e-01  -1.04469577e-01   2.83633101e-01   1.00452355e-01   -7.12572469e-01  -4.99234705e-01  -1.93152897e-01   1.80787567e-02] 

我需要从中提取所有浮点数并将它们放到列表/数组

我所做的是:

A = []
for line in open("general.txt", "r").read().split(" "):
    for unit in line.split("]", 3):
        A.append(list(map(lambda x: str(x), unit.replace("[", "").replace("]", "").split(" "))))

A包含['']或更差['3.20973096e-02\n']等元素。这些都是字符串,但我需要浮点数。怎么做?

3 个答案:

答案 0 :(得分:2)

为什么不使用正则表达式?

>>> import re
>>> e = r'(\d+\.\d+e?(?:\+|-)\d{2}?)'
>>> results = re.findall(e, your_string)
['5.44339373e+00',
 '2.77404404e-01',
 '1.26122094e-01',
 '9.83589873e-01',
 '1.95201179e-01',
 '4.49866890e-01',
 '2.06423297e-01',
 '1.04780491e+00',
 '4.34562117e-01',
 '1.04469577e-01',
 '2.83633101e-01',
 '1.00452355e-01',
 '7.12572469e-01',
 '4.99234705e-01',
 '1.93152897e-01',
 '1.80787567e-02']

现在,这些是匹配的字符串,但您可以轻松地将它们转换为浮点数:

>>> map(float, re.findall(e, your_string))
[5.44339373,
 0.277404404,
 0.126122094,
 0.983589873,
 0.195201179,
 0.44986689,
 0.206423297,
 1.04780491,
 0.434562117,
 0.104469577,
 0.283633101,
 0.100452355,
 0.712572469,
 0.499234705,
 0.193152897,
 0.0180787567]

注意,正则表达式可能需要一些调整,但它是一个良好的开端。

答案 1 :(得分:1)

作为一种更精确的方法,您可以使用正则表达式来分割线条:

>>> s="""[ -5.44339373e+00  -2.77404404e-01   1.26122094e-01   9.83589873e-01
...    1.95201179e-01  -4.49866890e-01  -2.06423297e-01   1.04780491e+00]
...  [  4.34562117e-01  -1.04469577e-01   2.83633101e-01   1.00452355e-01   -7.12572469e-01  -4.99234705e-01  -1.93152897e-01   1.80787567e-02] """
>>> print re.split(r'[\s\[\]]+',s)
['', '-5.44339373e+00', '-2.77404404e-01', '1.26122094e-01', '9.83589873e-01', '1.95201179e-01', '-4.49866890e-01', '-2.06423297e-01', '1.04780491e+00', '4.34562117e-01', '-1.04469577e-01', '2.83633101e-01', '1.00452355e-01', '-7.12572469e-01', '-4.99234705e-01', '-1.93152897e-01', '1.80787567e-02', '']

在这种情况下,您可以使用文件中的数据:

import re
print re.split(r'[\s\[\]]+',open("general.txt", "r").read())

如果你想在领先和尾随中获取空字符串,你可以使用列表理解:

>>> print [i for i in re.split(r'[\s\[\]]*',s) if i]
['-5.44339373e+00', '-2.77404404e-01', '1.26122094e-01', '9.83589873e-01', '1.95201179e-01', '-4.49866890e-01', '-2.06423297e-01', '1.04780491e+00', '4.34562117e-01', '-1.04469577e-01', '2.83633101e-01', '1.00452355e-01', '-7.12572469e-01', '-4.99234705e-01', '-1.93152897e-01', '1.80787567e-02']

答案 2 :(得分:0)

  1. 让我们啜饮文件

    content = open('data.txt').read()
    
  2. 拆分为']'

    logical_lines = content.split(']')
    
  3. 剥离'['和其他内容

    logical_lines = [ll.lstrip(' \n[') for ll in logical_lines]
    
  4. 转换为花车

    lol = [map(float,ll.split()) for ll in logical_lines]
    
  5. 将它全部粘在一线

    lol=[map(float,l.lstrip(' \n[').split()) for l in open('data.txt').read().split(']')]
    

    我已经根据我们给出的示例数据对其进行了测试,并且它有效......