我有一个包含文本块的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等参数,这是无用的。
答案 0 :(得分: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
但请注意,这假定字段内容(字段内)中不显示任何空格。但是,字段之间的空格很好。
答案 1 :(得分: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