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

4 投票
3 回答
730 浏览
提问于 2025-04-15 18:41

我在用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 个回答

0

这段代码没有像Tor的回答那样优雅,也没有用到正则表达式。准备好接受大家的负面评价吧!

#!/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
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])))

撰写回答