有没有什么工具可以直接从文本构建对象,比如googleprotocolbuffer?

2024-05-12 20:24:47 发布

您现在位置:Python中文网/ 问答频道 /正文

在大多数日志处理系统中,日志文件都是tab分隔的文本文件,文件的模式是单独提供的。 例如。你知道吗

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

架构是

id : uint64
name : string
email : string

为了找到这样的记录个人姓名=='汤姆',代码是

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 protocol buffer(二进制)这样的工具,我们可以直接从文本中构建对象?你知道吗

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

所以我们比造人更像这样:人=库BuildFromText(行)

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

Tags: 文件nameincomidforstringemail
2条回答

你怎么知道的库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
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())})

相关问题 更多 >