-2

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

我有以下原始文本文件:

============================
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 的状态。我的脚本也会遍历多个文件。我的问题是我很难理解 regex 模块在 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()
4

2 回答 2

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: "零件。
  • 拆分开'.'
  • 对于每个组件:
    • 在 .周围分成 2 块:
    • 从这两部分中去除无关的空白。
    • 如果键与您要查找的键匹配,则该值就是您想要的键。

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

例如:

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']
于 2013-09-25T22:05:47.617 回答
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)
于 2013-09-25T22:22:40.217 回答