簡體   English   中英

使用python從文件中提取浮點數

[英]Extracting float numbers from file using 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']元素。 這些都是字符串,但是我需要浮點數。 怎么做?

為什么不使用正則表達式?

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

注意,正則表達式可能需要進行一些調整,但這是一個好的開始。

作為更精確的方法,您可以使用正則表達式來分割行:

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

一口氣將其全部粘貼

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

我已經根據我們提供的示例數據對其進行了測試,並且可以正常工作...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM