2010-01-31 4 views
4

У меня возникли проблемы с использованием python reg exp для чтения данных из файла.Использование Python Reg Exp для чтения данных из файла

В файле есть данные, которые я хочу, и некоторая информация, которая мне не интересна. Пример информации, которую меня интересует, приведен ниже. Количество строк будет меняться

FREQ VM(VOUT)   

1.000E+00 4.760E+01 

1.002E+00 4.749E+01 
Y 

Я хочу, чтобы создать список кортежей, как:

[(1.000, 47.6),(1.002, 47.49)] 

Я пытаюсь прочитать файл, пока я не нашел «VM (VOUT) FREQ» линия и прочитайте данные, пока я не нажму «Y».

У меня 2 вопроса:

  1. Можно ли получить все точки с одним выражением или мне нужно сделать петлю через каждую строку и искать начало конца? Кажется, я не могу заставить reg exp работать, когда я пытаюсь найти раздел и читать точки в одном выражении.
  2. Как разобрать номер, который находится в технических обозначениях?

Я не мог найти пример, который был очень близок к тому, что я делаю. Если он там, пожалуйста, укажите мне его.

ответ

3

Я думаю, что это даст вам то, что вы хотите. Пока файл согласован.

from csv import reader 
with open('file') as f: 
    listoftuples = [(float(row[0]), float(row[1])) 
        for row in reader(f, delimiter=' ') 
        if row and row[0] != 'FREQ'] 

Если вы хотите, чтобы разбить на 'Y', то сделать это менее элегантный штуковина:

from csv import reader 
l = [] 
with open('file') as f: 
    for row in reader(f, delimiter=' '): 
    if row[0] == 'Y': 
     break 
    if row and row[0] != 'FREQ': 
     l.append((floar(row[0]), float(row[1]))) 
+0

"$ е"? Вы снова трогали PHP, не так ли? –

+0

Да :(Это больно –

+0

Очень элегантный. Однако он будет продолжать собирать значения после «Y», если файл содержит данные после него - если это не так, то это прекрасно. –

0

Не так элегантно, как Tor's answer. Также нет регулярных выражений. Принесите вниз!

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import decimal 
import os 

def main(): 
    we_care = False # start off not caring 

    list_of_tuples = [] 

    f = open('test.txt','r') 

    for line in f: 
     if line.startswith('FREQ'): 
      we_care = True # we found what we want; now we care 
      continue 
     if we_care: 
      try: 
       x,y = (decimal.Decimal(x) 
         for x in line.rstrip(os.linesep).split()) 
       list_of_tuples.append((x,y)) 
      except ValueError: 
       pass # we get here when a line doesn't contain two floats 
      except decimal.InvalidOperation: 
       pass # we get here when a line contains a non-decimal 
      if line.startswith('Y'): 
       break # break out of processing once you've got your data 
    return list_of_tuples 

if __name__ == "__main__": 
    print main() 

Возвращает:

[(Decimal('1.000'), Decimal('47.60')), (Decimal('1.002'), Decimal('47.49'))] 
1
import decimal 
flag=0 
result=[] 
for line in open("file"): 
    line=line.rstrip() 
    if line == "Y": flag=0 
    if line.startswith("FREQ VM"): 
     flag=1 
     continue 
    if flag and line: 
     result.append(map(decimal.Decimal,line.split())) 
print result 
Смежные вопросы