Создать несколько Python словарей из списка? - PullRequest
1 голос
/ 10 января 2020

Мне трудно разделить файл 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 голосов
/ 10 января 2020

Это даст вам желаемый результат:

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'}]
0 голосов
/ 10 января 2020

Ты очень близко! Просто нужно заполнить ваш 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
0 голосов
/ 10 января 2020

Что-то в этом духе.

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 
...