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、名前などのパラメーターに従っていることを考えると、これは役に立たない.

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") は、個別に必要な場合は各列のリストを提供します。それ以外の場合は、既に 1 つの 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 に答える