从文本分析

2024-05-16 03:09:44 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能帮我解决这个问题吗?你知道吗

我有以下原始文本文件:

============================
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()

Tags: ofimporttimestatuslineminstageglob
2条回答

如果您不理解regexp,并且不愿意学习它们,就不要使用它们。如果没有它们,这是很容易解析的。你知道吗

要分析的第一行是:

"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: "部分。你知道吗
  • '.'上拆分
  • 对于每个组件:
    • :周围正好分成两块。你知道吗
    • 去掉这两块纸上多余的空白。你知道吗
    • 如果该键与您要查找的键匹配,则该值就是您想要的值。你知道吗

你可以进一步推广它,把所有的键值对做一个dict,然后你就可以在dict中查找你想要的一个

例如:

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

像这样的?你知道吗

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)

相关问题 更多 >