Python 读取特定字段的txt文件并将其存储在numpy数组中

Python 读取特定字段的txt文件并将其存储在numpy数组中,python,numpy,Python,Numpy,我有一个包含文本块的txt文件(基本上是一个日志文件)。每个区块或段落都有关于事件的特定信息。我需要的是从每个块中只提取特定信息,并将其保存为数组或列表 每个段落的格式如下: id: [id] Name: [name] time: [timestamp] user: [username] ip: [ip_address of the user] processing_time: [processing time in seconds] 示例段落可以是: id: 23455 Name: ymal

我有一个包含文本块的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、名称等参数。

您可以使用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

但是,请注意,这是假设字段内容(字段内)中没有空格但是,字段之间的空白是可以的。

如果名称字段可以包含空白,则可以使用正则表达式提取日期。但是,您必须自己将值转换为相应的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
对于包含内容的文件“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

任何值(我特别关注的是
Name:
)是否包含空格?它们确实包含空格!让我用代码片段更新我的问题,以提取其中包含名称参数的所有行(尽管我还无法删除空格和换行符)文本文件有空格…这就是为什么我认为它引发了索引器错误:列表索引超出范围异常。你是指字段内的空格还是字段之间的空格?主要的一点是,numpy的例程将假设列之间由空格分隔。如果某些数据列可以包含空格,则它们自己(例如,您允许使用“y malsen”作为名称),上述方法将不起作用,但在其他情况下应该起作用。(您提供的示例中,只有数据列,其中没有空格。)是的,问题是一些数据值之间有空格…-/好的,我对这种情况做了一个单独的回答,见下文。点击Balint!太棒了!现在,如果我也需要获取时间:和ip:字段呢?正则表达式是什么?(这是我最困惑的部分…解释/猜测正则表达式)。是的,您必须相应地扩展正则表达式。IP类似于
IP:\s*(?P\d+\.\d+\.\d+\.\d+\.\d+.\d+
,时间类似于
time:\s*(?P\d+:\d+:\d+)
。有关regexp的详细信息,您可以咨询。regex部分是否类似于:PAT=re.compile(r”“”id:\s*(?P\d+\s*)name:\s*(?P>)[0-9A-Za-z]+?)\s+time:.*time:\s*(?P\d:\d:\d)ip:\s*(?P\d+\.\d+\.\d+)处理时间:\u time:\s*(?P\d+)”,re.VERBOSE)…对此我很抱歉,但我不擅长正则表达式,这就是为什么有点困扰您的原因。-)包括时间和ip,它看起来是
re.compile(r“”“id:\s*(?P\d+)\s*名称:\s*(?P[0-9A-Za-z]+?)\s*时间:\s*(?P\d+:\d+:\d+)\s**ip:\s*(?P\d+\。\d+。\d+。\d+)\s*处理时间:\s*(?P\d+”,re.VERBOSE)
。但是,如果你使用正则表达式,我强烈建议你花1-2个小时来阅读一些关于它的文档。例如,请看。巴林,谢谢兄弟。你让我度过了美好的一天!
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