2015-02-19 3 views
-1

У меня есть .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']. Это все строки, но мне нужны поплавки. Как это сделать?

+0

«A содержит такие элементы, как ['']" - тогда, пожалуйста, укажите лучший пример файла. –

+0

@ AndréLaszlo, что вы думаете о лучшем примере? – Xxx

+0

Вы можете 'str.strip' строку перед' str.split' и либо «фильтровать» из пустых элементов, либо использовать 'str.split()' (примечание: ** no arguments **) для группировки последовательных пробелов , – jonrsharpe

ответ

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

Почему нет использовать регулярное выражение?

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

Обратите внимание, что регулярное выражение может потребоваться некоторые настройки, но это хорошее начало.

+0

И, чтобы зафиксировать знак минус в некоторых значениях, регулярное выражение может быть изменено на 'e = r '(- * \ d + \. \ D + e? (?: \ + | -) \ d {2}?) '' – FuzzyDuck

+0

Как добавить к регулярному выражению @ и ^? – Xxx

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] 
    

Вставлять все это в одном лайнере

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

Я проверил это на Воплощением данных, которые мы получили, и это работает ...