读取txt文件中特定字段并存储到numpy数组中

1 投票
2 回答
1690 浏览
提问于 2025-04-17 18:41

我有一个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、名字等参数来提取信息。

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"]aa["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

不过,请注意,这个方法假设字段内容中没有空格(字段内部不能有空格)。字段之间的空格是可以的。

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

撰写回答