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

使用python从文件中提取浮点数,python,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.9

我有一个.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']
。这些都是字符串,但我需要浮点数。如何做到这一点?

更准确地说,您可以使用正则表达式拆分行:

>>> 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']

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

>>> 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]
注意,正则表达式可能需要一些调整,但这是一个良好的开端

  • 让我们把文件弄脏

    content = open('data.txt').read()
    
  • ']'上拆分

    logical_lines = content.split(']')
    
  • 去掉
    '['
    和其他东西

    logical_lines = [ll.lstrip(' \n[') for ll in logical_lines]
    
  • 转换为浮点数

    lol = [map(float,ll.split()) for ll in logical_lines]
    
  • 把它粘在一个衬里里

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

    我已经在给我们的示例数据上测试了它,它是有效的…

    “A包含像['']”这样的元素-那么请提供一个更好的示例文件。@AndréLaszlo更好的示例是什么意思?你可以
    str.strip
    str.split
    之前的行,然后
    过滤出空元素或使用
    str.split()
    (注意:无参数)将连续空格分组。@Xxx用示例代码读取示例文件的问题似乎在于示例文件实际上不是这样的。例如,示例文件中没有
    字符。如果您只是猜测文件的实际外观,任何人都很难帮到您。并且要捕获减号在某些值中,正则表达式可以修改为
    e=r'(*\d+\.\d+e?(?:\+\124;-)\ d{2}?)
    如何添加到正则表达式@和^?