当数据嵌套严重时,如何使用python获取信息

当数据嵌套严重时,如何使用python获取信息,python,parsing,text,text-mining,Python,Parsing,Text,Text Mining,我有一个文本文件,其中包含一些要挖掘的数据 结构如下所示 name (personA { field1 : data1 field2 : data2 fieldN : dataN subfield() { fieldx1 : datax1 fieldxN : dataxN } } name (personB { field1 : data11 field2 : data12 fi

我有一个文本文件,其中包含一些要挖掘的数据

结构如下所示

name (personA {
    field1 : data1
    field2 : data2
    fieldN : dataN
    subfield() {
        fieldx1 : datax1
        fieldxN : dataxN
        }
    }
   name (personB {
    field1 : data11
    field2 : data12
    fieldN : data1N
    }
{'field1': 'data1', 'fieldN': 'dataN', 'name': '(personA', 'fieldxn': 'unknown'}
{'field1': 'data11', 'fieldN': 'data1N', 'name': '(personB', 'fieldxn': 'unknown'}
在某些人的记录中,子字段不存在,在这种情况下,输出应指定子字段为未知。下面是我用来提取数据的代码

import re
data = dict()
with open('data.txt', 'r') as fin:
    FLAG, FLAGP, FLAGS = False, False, False
    for line in fin:
        if FLAG:
            if re.search('field1', line):
                d1 = line.split()[2]
                data['field1'] = d1
            if re.search('fieldN', line):
                dN = line.split()[2]
                data['fieldN'] = dN
                data['fieldxn'] = 'unknown'
                FLAGP = True
        if FLAGS:
            if re.search('fieldxN', line):
                dsN = line.split()[2]
                data['fieldxn'] = dsN

        if re.search('name\ \(', line):
            pn = line.split()[1]
            FLAG = True
            data['name'] = pn
        if re.search('subfield', line):
            FLAGS = True
        if len(data) == 4:
           if FLAGP:
               print data
               FLAGP = False
               FLAG = False
               FLAGS = False
输出如下所示

name (personA {
    field1 : data1
    field2 : data2
    fieldN : dataN
    subfield() {
        fieldx1 : datax1
        fieldxN : dataxN
        }
    }
   name (personB {
    field1 : data11
    field2 : data12
    fieldN : data1N
    }
{'field1': 'data1', 'fieldN': 'dataN', 'name': '(personA', 'fieldxn': 'unknown'}
{'field1': 'data11', 'fieldN': 'data1N', 'name': '(personB', 'fieldxn': 'unknown'}
问题是,我不知道在哪里打印数据,所以目前我使用的是下方状态打印数据,这是错误的

if len(data) == 4:
    if FLAGP:
       print data
       FLAGP = False
       FLAG = False
       FLAGS = False

如果有人能给出正确检索数据的建议,我将不胜感激。我将采用不同的方法进行解析,将子字段(和其他字段)存储在字典中

data = open('data.txt', 'rt').read()

### Given a string containing lines of "fieldX : valueY" 
### return a dictionary of values
def getFields(field_data):
    fields = {}
    if (field_data != None):
        field_lines = field_data.strip().split("\n")
        for pair in field_lines:
            name, value = pair.split(":")
            fields[name.strip()] = value.strip()
    return fields


### Split the data by name
people_data = data.strip().split("name (")[1:]

### Loop though every person record
for person_data in people_data:
    name, person_data = person_data.split(" {", 1)   # split the name and the fields
    # Split out the subfield data, if any
    subfield_data = None
    if (person_data.find("subfield()") > -1):
        field_data, subfield_data = person_data.split("subfield() {", 1)
        subfield_data = subfield_data.split("}")[0]
    # Separate the fields into single lines of pairs
    fields = getFields(field_data)
    # and any subfields
    subfields = getFields(subfield_data)

    print("Person: "+str(name))
    print("Fields: "+str(fields))
    print("Sub_Fields:"+str(subfields))
这给了我:

Person: personA
Fields: {'field1': 'data1', 'field2': 'data2', 'fieldN': 'dataN'}
Sub_Fields:{'fieldx1': 'datax1', 'fieldxN': 'dataxN'}
Person: personB
Fields: {'field1': 'data1', 'field2': 'data2', 'fieldN': 'dataN'}
Sub_Fields:{}

因此,您可以根据子字段是
None
,还是其他情况调整输出。其思想是将数据输入到更灵活的结构中,而不是像您所做的那样进行“暴力”解析。在上面的文章中,我经常使用
split()
来提供一种更灵活的方式,而不是依赖于找到确切的名称。显然,这也取决于您的设计要求。

您试图归档的不是文本挖掘,而是解析格式。您对数据格式了解多少?什么是数据源?虽然它们不容易学习使用,但处理此类输入的最佳方法之一是使用所谓的无扫描(或无词汇)解析器,如pyparsing(请参阅)。例如,使用此软件,您可以在解析过程中将“subfield”的默认值设置为
None
,然后在后续处理过程中捕获该值。@BillBell谢谢您的指针,我将查看一下