1

我有一个包含文本块的 txt 文件(基本上是一个日志文件)。每个块或段落都有关于事件的某些信息。我需要的是从每个块中仅提取特定信息并将其保存为数组或列表。

每个段落的格式如下:

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)

但它只是提取所有块并将它们放入单个数组中,考虑到我遵循 Id、name 等参数,这有点没用。

4

2 回答 2

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

但是,请注意,这是假设字段内容(字段内)中没有出现空格。不过,字段之间的空格很好。

于 2013-03-11T15:04:14.753 回答
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
于 2013-03-11T15:45:11.737 回答