2013-03-11 47 views
1

我有一個txt文件(基本上是一個日誌文件)有文本塊。每個塊或段落都有關於事件的某些信息。我需要的是僅從每個塊中提取特定信息並將其保存爲數組或列表。閱讀txt文件的特定字段,並將它們存儲在一個numpy數組中

每個段落有以下格式:

id: [id] Name: [name] time: [timestamp] user: [username] ip: [ip_address of the user] processing_time: [processing time in seconds] 

樣本段落可以是:

id: 23455 Name: ymalsen time: 03:20:20 user: ymanlls ip: 230.33.45.32 processing_time: 05 

我需要從每個塊中提取是:

id:[] 
Name:[] 
processing_time: [] 

所以我結果數組爲每個塊的結果將是:

array = [id, name, processing_time] 

一個問題是,我的文本文件的大小相當大,有成千上萬的這些記錄。什麼是最好的方式來做我需要在Python中做的事情(精確地說是2.7)。一旦我有每個數組(對應於每個記錄),我將它們全部保存在一個ND numpy數組中,就是這樣。任何幫助將不勝感激。

這裏是我現在用的明明白白提取開始與ID的所有行:

import string 

log = 'log_1.txt' 
file = open(log, 'r') 


name_array = [] 


line = file.readlines() 
for a in line: 
    if a.startswith('Name: '): 
     ' '.join(a.split()) 
     host_array.append(a) 

但它只是提取所有塊,並將它們放入一個單一的陣列,這是一種無用的給我我下面的編號,名稱等

+0

可以在任何的價值觀 - 我在'名稱看,特別是:' - 包含空格 – DSM 2013-03-11 15:04:15

+0

他們這樣做讓我與我使用的代碼片段更新我的問題?!提取所有帶有Name參數的行(儘管我無法刪除空格和換行符) – khan 2013-03-11 15:05:48

回答

1

如果名稱字段可以包含空格,則可以使用正則表達式提取日期。然而,那麼你將不得不將自己的值轉換爲相應的python類型。下面的程序:

import numpy as np 
import re 

PAT = re.compile(r"""id:\s*(?P<id>\d+)\s* 
        Name:\s*(?P<name>[0-9A-Za-z ]+?)\s+time:.* 
        processing_time:\s*(?P<ptime>\d+)""", re.VERBOSE) 

values = [] 
fp = open("proba.txt", "r") 
for line in fp: 
    match = PAT.match(line) 
    if match: 
     values.append((int(match.group("id")), 
         match.group("name"), 
         int(match.group("ptime")))) 
fp.close() 
print values 

將打印的結果是:

[(23455, 'y malsen', 5), (23455, 'ymalsen', 5)] 

一個文件「PROBA。TXT」與內容

id: 23455 Name: y malsen time: 03:20:20 user: ymanlls ip: 230.33.45.32 processing_time: 05 
id: 23455 Name: ymalsen time: 03:20:20 user: ymanlls ip: 230.33.45.32 processing_time: 05 
+0

現貨!精彩!現在,如果我需要獲取時間:和ip:字段呢?正則表達式是什麼? (這是我最困惑的部分...解釋/猜測正則表達式)。 – khan 2013-03-11 16:01:49

+0

是的,你必須相應地擴展正則表達式。 IP會像'ip:\ s *(?P \ d + \。\ d + \。\ d + \。\ d +)'和時間像'time:\ s *(?P

+0

正則表達式部分應如下所示:PAT = re.compile(r「」「id:\ s *(?P \ d +)\ s * name:\ s *(?P [0-9A-Za-時間:\ s *(?P

1

你可以使用numpy的偉大loadtxt例行成記錄陣列加載數據,並從那裏提取它的參數:

import numpy as np 

aa = np.loadtxt("proba.txt", usecols=(1, 3, 11), 
       dtype={"names": ("id", "name","proctime"),      
         "formats": ("i4", "a100", "i4")}) 
print aa["name"] 
print aa["id"] 
print aa["proctime"] 

該示例從proba.txt加載您的數據並將其存儲在aa中。如果單獨需要它們,適當的元素(aa["name"],aa["id"], ȧa["proctime")會爲您提供每個列的列表,否則,您已將它們放入一個numpy數組中。上面代碼:

['ymalsen' 'ymalsen'] 
[23455 23455] 
[5 5] 

的文件proba.txt有以下內容:

id: 23455 Name: ymalsen time: 03:20:20 user: ymanlls ip: 230.33.45.32 processing_time: 05 
id: 23455 Name: ymalsen time: 03:20:20 user: ymanlls ip: 230.33.45.32 processing_time: 05 

但是,請注意,這是假設,沒有空格出現在字段內容(內場)。儘管如此,田野之間的空白也很好。

+0

該文本文件具有空格...這就是爲什麼我認爲它引發IndexError:list index out範圍內的異常 – khan 2013-03-11 15:15:56

+0

你指的是域之間或它們之間的空格嗎?主要的一點是,numpy的例程會假設列被空格分隔,如果某些數據列可以包含空格本身(例如,允許「y馬爾森「作爲一個名字),上述方法將不起作用,否則這應該。 (你提供的例子,只有數據列沒有空格在其中。) – 2013-03-11 15:25:55

+0

是的,有些數據值之間有空格..: -/ – khan 2013-03-11 15:29:21

相關問題