0

ほとんどのログ処理システムでは、ログ ファイルはタブ区切りのテキスト ファイルであり、ファイルのスキーマは個別に提供されます。例えば。

12 tom tom@baidu.com
3 jim jim@baidu.com

スキーマは

id : uint64
name : string
email : string

このperson.name == 'tom' のようなレコードを見つけるには、コードは

for each_line in sys.stdin:
  fields = each_line.strip().split('\t')
  if feilds[1] == 'tom':  # magic number
    print each_line

マジックナンバーは1 2 3が多いです。

Google プロトコル バッファ (バイナリ用) のようなツールはありますか?テキストから直接オブジェクトを構築できますか?

Message Person {
  uint64 id = 1;
  string name = 2;
  string email = 3;
}

したがって、次のように person をビルドします: person = lib.BuildFromText(line)

for each_line in sys.stdin:
  person = lib.BuildFromText(each_line) # no magic number
  if person.name == 'tom':
    print each_line
4

2 に答える 2

0
import csv

Person = {
    'id': int,
    'name': str,
    'email': str    
}

persons = []
for row in csv.reader(open('CSV_FILE_NAME', 'r'), delimiter='\t'):
    persons.append({item[0]: item[1](row[index]) for index, item in enumerate(Person.items())})
于 2012-08-31T07:57:01.067 に答える
0

lib.BuildFromText() 関数はどのようにしてフィールドの命名方法を知っていると思いますか? それらは、渡した行の単なる値ですよね? これを Python で行う方法は次のとおりです。

import sys
from collections import namedtuple
Person = namedtuple('Person', 'id, name, email')
for each_line in sys.stdin:
    person = Person._make(each_line.strip().split('\t'))
    if person.name == 'tom':
        print each_line
于 2012-08-31T08:02:47.480 に答える