2013-09-25 178 views
-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 

我想分析我的腳本將經過多個文件作爲舞臺8的類型(5000AX-FG),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() 
+0

我們不是教程網站。如果你不瞭解正則表達式,有很多教程可用。當您遇到特定問題時請回來。 – Veedrac

+0

用簡單的字符串處理解析簡單的語言是開始的好方法......如果沒有其他原因,最終你的代碼變得如此令人沮喪,以至於你最終有動力坐下來學習正則表達式或pyparsing或更好的東西。 :) – abarnert

回答

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