-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 のステータスを解析したいと考えています。スクリプトも複数のファイルを通過します。私の問題は、正規表現モジュールが 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"

英語では、あなたがしたいことは次のとおりです。

  • 行末から改行を取り除きます。
  • 空白の実行ごとに、行を単語に分割します。
  • 最後の言葉を取ります。
  • 末尾のセミコロンを取り除きます。

もちろん、これらを並べ替えたり、いくつかを 1 つのステップに結合したりできますが、これを直接 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: "ます。その後に、1 つ以上のキーと値のペアがあり、ペアはピリオドとオプションの空白で区切られ、コロンとオプションの空白で各キーと値が区切られています。そう:

  • 末尾の改行を取り除きます。
  • パーツを剥がし"Line NN: "ます。
  • スプリットオン'.'
  • 各コンポーネントについて:
    • の周りで正確に 2 つに分割し:ます。
    • 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 に答える