从列表创建多个Python字典?

时间:2020-01-10 16:55:35

标签: python dictionary ldap python-3.4 ldif

我很难将具有成千上万个条目的LDIF文件拆分为多个词典。例如,我的LDIF文件如下:

dn: value
ou: value
objectClass: value
entryUUID: value
creatorname: value
entryNNN: value
modifierName: value
modifyTimestamp: value

dn: value
ou: value
…
…
…

我想做的是以“ dn:”开头的单独行,并将下面的每一行分成单独的词典。例如:

ldap_core_record_1 = {'dn:': 'value', 'ou:': 'value',...}
ldap_core_record_2 = {'dn:': 'value', 'ou:': 'value',...}

这是我到目前为止的代码:

def parse_LDAP_Core_Schema():
    LDAP_CORE_LIST = []
    LDAP_CORE_DICT = {}
    LDAP_CORE_FILE = '/…/…/…/…/ldap_core_backup.ldif'      """This is the LDAP generated from slapcat"""
    with open(LDAP_CORE_FILE, 'r') as LDAP_CORE_OBJECT:
        LDAP_CORE_LIST = LDAP_CORE_OBJECT.readlines()
        for line in LDAP_CORE_LIST:
            if line.startswith("dn: "):

从那里,我很困惑。我不知道如何正确拼接列表,因为我仅使用Python了很短的时间。不幸的是,我正在使用Python 3.4.2。

3 个答案:

答案 0 :(得分:0)

沿这条线。

def parse_LDAP_Core_Schema():
    LDAP_CORE_FILE = '/…/…/…/…/ldap_core_backup.ldif'      """This is the LDAP generated from slapcat"""
    results = []
    with open(LDAP_CORE_FILE, 'r') as LDAP_CORE_OBJECT:
        results = []
        for line in LDAP_CORE_OBJECT:
            key, value = line.strip().split(': ')
            if key == 'dn':  # add new element to list
                results.append({'dn': value})
            else:  # add new key: value to latest element of list
                results[-1][key] = value
    return results 

答案 1 :(得分:0)

这将为您提供所需的输出:

file_path = '/…/…/…/…/ldap_core_backup.ldif'

with open(file_path) as file:
    records = []
    for line in file.readlines():
        line = line.replace('\n', '')
        if not line:  # skip empty lines
            continue
        key, value = line.split(': ')
        if key == 'dn':
            records.append({key: value})
        else:
            records[-1][key] = value

print(records)

>>> [{'dn': 'value', 'ou': 'value', 'objectClass': 'value', 'entryUUID': 'value', 'creatorname': 'value', 'entryNNN': 'value', 'modifierName': 'value', 'modifyTimestamp': 'value'}, {'dn': 'value', 'ou': 'value'}]

答案 2 :(得分:0)

您非常亲密!只需使用临时LDAP_CORE_LIST的结果填充您的LDAP_CORE_DICT

def parse_LDAP_Core_Schema():
    LDAP_CORE_LIST = []
    LDAP_CORE_DICT = {}
    LDAP_CORE_FILE = '/…/…/…/…/ldap_core_backup.ldif'   # LDAP generated from slapcat
    with open(LDAP_CORE_FILE, 'r') as LDAP_CORE_OBJECT:
        LDAP_CORE_LIST = LDAP_CORE_OBJECT.readlines()
        for line in LDAP_CORE_LIST:
            if line.startswith("dn: "):    # If new DN
                if LDAP_CORE_DICT:         # Push current dict into list
                    LDAP_CORE_LIST.append(LDAP_CORE_DICT)
                k, v = line.split(":", maxsplit=1)      # Split line at first colon
                LDAP_CORE_DICT = {k: v.strip()}         # Create object with first value
            else:                          # Not a new DN line
                try:
                    k, v = line.split(":", maxsplit=1)  # Split line at first colon
                    LDAP_CORE_DICT[k] = v.strip()       # Update object
                except ValueError:         # Ignore blank and malformatted lines
                    pass
        else: # After completing the loops, push final dict into list
            if LDAP_CORE_DICT:             # Push current dict into list
                LDAP_CORE_LIST.append(LDAP_CORE_DICT)

    print(LDAP_CORE_LIST)                  # [{'dn': 'value1', 'ou': 'value2', ...}, ...]
    return LDAP_CORE_LIST