使用Python正则表达式从文件中读取数据

4

我在使用Python正则表达式从文件中读取数据时遇到了问题。

该文件包含我想要的数据和我不感兴趣的一些信息。以下是我感兴趣的信息示例。行数会有所变化。

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”。我有两个问题:
1. 是否可以使用一个表达式获取所有点,还是需要循环每一行并查找起始和结束?当我尝试查找部分并在单个表达式中读取点时,似乎无法使正则表达式工作。
2. 如何解析以工程符号表示的数字?
我找不到非常接近我所做的示例。如果有,请指出来。
3个回答

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

"$f"? 你又在碰 PHP 了,是吧。 - Ignacio Vazquez-Abrams
非常优雅。但是,如果文件中包含它之后的数据,它将继续收集值 - 如果没有,那么这就是完美的。 - Tim Pietzcker

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接