【问题标题】:Create Multiple Python Dictionaries from a List?从列表中创建多个 Python 字典?
【发布时间】:2020-04-28 08:28:23
【问题描述】:

我很难将包含数千个条目的 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。

【问题讨论】:

  • 查看字符串的split 方法。

标签: python dictionary ldap python-3.4 ldif


【解决方案1】:

类似的东西。

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 

【讨论】:

    【解决方案2】:

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

    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'}]
    

    【讨论】:

      【解决方案3】:

      你非常接近!只需使用来自临时LDAP_CORE_DICT 的结果填充您的LDAP_CORE_LIST

      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
      

      【讨论】:

      • LDAP_CORE_DICT = {k: v.strip() for k, v in (line.split(":", maxsplit=1),)} .....它不喜欢 for 语句。给Syntax Error: invalid syntax
      • @Jay_Will500 将 dict 理解更新为更简单
      猜你喜欢
      • 2022-06-27
      • 2022-07-27
      • 1970-01-01
      • 2013-10-26
      • 2017-05-05
      • 2016-12-07
      • 2020-11-17
      • 2018-04-27
      • 1970-01-01
      相关资源
      最近更新 更多