Использование Python Reg Exp для чтения данных из файла - PullRequest
4 голосов
/ 31 января 2010

У меня проблемы с использованием 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)]

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 31 января 2010

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

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])))
1 голос
/ 31 января 2010
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
0 голосов
/ 31 января 2010

Не так элегантно, как Ответ Тора . Также нет регулярных выражений. Принеси отрицательный голос!

#!/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'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...