从文本文件中解析

时间:2013-09-25 21:55:35

标签: python parsing

有人可以帮我解决这个问题吗?

我有以下原始文本文件:

============================
Line of text
Line 3: Port #: 12; Type: 5000AX-FG;
============================

- - Stage 1 - -
Duration: 0 hrs 0.60 min.  Total Elapsed Time: 0 hrs 0.60 min.
Status: Done

...

- - Stage 8 - -
Line 66: Duration: 11 hrs 48.0 min.  Total Elapsed Time: 16 hrs 35.6 min.
Line 67: Status: Done

我想解析类型(5000AX-FG),阶段8的持续时间和阶段8的状态。我的脚本也将遍历多个文件。我的问题是我很难理解正则表达式模块在Python中的工作原理。我在将它应用到我的情况时遇到了问题。任何建议都将不胜感激。

这是我到目前为止所做的:

#!/usr/bin/python

import glob
import re
import csv

list_of_files = glob.glob('*06*.rpt')

for fileName in list_of_files:
    f=open(fileName, 'r')
    print f
    for i, line in enumerate(f):
        if i == 2:
            print line
        elif i == 65:
            print line
        elif i == 66:
            print line
    f.close()

2 个答案:

答案 0 :(得分:3)

如果您不了解正则表达式,并且不愿意学习它们,那就不要使用它们。没有它们,这很容易解析。

您要解析的第一行是:

"Line 3: Port #: 12; Type: 5000AX-FG;\n"

在英语中,您要做的是:

  • 将换行符脱离行尾。
  • 在每次空白行中将行拆分为单词。
  • 说完最后一句话。
  • 从分号末端剥去分号。

你可以明显地重新安排这些,将它们中的一些组合成一个步骤等等,但是让我们直接将它翻译成Python:

if i == 2:
    line = line.rstrip() # 'Line 3: Port #: 12; Type: 5000AX-FG;'
    words = line.split() # ['Line', '3:', 'Port', '#:', '12;', 'Type:', '5000AX-FG;']
    last_word = line[-1] # '5000AX-FG;'
    part_type = last_word.rstrip(';') # '5000AX-FG'
    print part_type

如果你想变得更聪明,请注意线条内的图案,并使用它们进行分割。例如,在这一行中,以及所有类似的行:

Line 66: Duration: 11 hrs 48.0 min.  Total Elapsed Time: 16 hrs 35.6 min.

他们都以"Line NN: "开头。之后,有一个或多个键值对,其中的对由句点和可选的空格分隔,冒号和可选的空格分隔每个键和值。所以:

  • 剥掉尾随换行符。
  • 剥离"Line NN: "部分。
  • 拆分'.'
  • 对于每个组件:
    • :周围分成两部分。
    • 从两件上剥去无关的空白。
    • 如果密钥与您要查找的密钥相匹配,则该值为您想要的密钥。

你可以进一步概括它 - 制作所有键值对的字典,然后你可以在那个字典中查找你想要的那个。

例如:

def parse_line(line):
    line = line.rstrip()
    line = line.partition(':')[-1]
    parts = line.split('.')
    mapping = {}
    for part in parts:
        key, _, value = part.partition(':')
        mapping[key.strip()] = value.strip()
    return mapping

现在:

if i == 65:
    mapping = parse_line(line)
    print mapping['Duration']

答案 1 :(得分:1)

这样的东西?

import glob

def parse_files(list_of_files):
    for fileName in list_of_files:
        with open(fileName, 'r') as f:
            f.readline()
            f.readline()
            line = f.readline()
            #"Line 3: Port #: 12; Type: 5000AX-FG;\n"
            yield line.split(';')[1].split(':')[1]

for result in parse_files(glob.glob('*06*.rpt')):
    print(result)