преобразование словаря Python с байтами в строку в python 3.8

#python #dictionary #unicode #utf-8 #active-directory

#python #словарь #юникод #utf-8 #active-directory

Вопрос:

Я надеюсь, что люди смогут мне помочь. Заранее прошу прощения за любые грамматические ошибки. Я работаю над крупномасштабным переносом данных LDAP в базу данных MYSQL. Дамп LDAP из программы python, которую я «унаследовал». По соображениям производительности и обслуживания мы перемещаем данные из LDAP в систему веб-аутентификации, которая использует MySQL в качестве серверной части. По деловым соображениям перенос LDAP на webauth произойдет в течение следующего года, поэтому мне нужно синхронизировать две системы.

Использование python 2 в течение многих лет — Unicode / UTF-8 в python 3 — это область, которая причиняет мне много боли.

Дамп ldap выдает следующий вывод как часть выполнения

 {'sn': [b'Jones'], 'title': [b'WH Trainee'], 'givenName': [b'Example'], 'distinguishedName': [b'CN=Example Jones,OU=Warehouse Trainees,OU=GU,DC=jupiter,DC=somecorp,DC=org'], 'whenCreated': [b'20201027121144.0Z'], 'department': [b'WHSE'], 'sAMAccountName': [b'ejones'], 'manager': [b'CN=Bobby Smith,OU=WHSE,OU=GU,DC=jupiter,DC=somecorp,DC=org']}
  

Отформатировано для облегчения чтения:
** существующий вывод**

 {
'sn': [b'Jones'], 
'title': [b'WH Trainee'], 
'givenName': [b'Example'], 
'distinguishedName': [b'CN=Example Jones,OU=Warehouse Trainees,OU=GU,DC=jupiter,DC=somecorp,DC=org'], 
'whenCreated': [b'20061027132244.0Z'], 
'department': [b'WHSE'], 
'sAMAccountName': [b'ejones'], 
'manager': [b'CN=Bobby Smith,OU=WHSE,OU=GU,DC=jupiter,DC=somecorp,DC=org']
}
  

Нам нужно преобразовать этот вывод в простую строку, пары ключ-значение в словаре. Я хотел бы реализовать это как простую функцию, которую можно вызвать и преобразовать все значения в словаре сразу. К сожалению, в некоторых записях ldap отсутствуют такие вещи, как отделы и менеджеры, поэтому количество ключей и значений в dict варьируется. Мне нужен способ преобразовать значения байтов в dict в простые строки ascii.

Требуемое преобразование с использованием одной функции вызывает что-то вроде transformdict(dictname)

желаемый результат

 {
'sn': 'Jones', 
'title': 'WH Trainee', 
'givenName': 'Example', 
'distinguishedName': 'CN=Example Jones,OU=Warehouse Trainees,OU=GU,DC=jupiter,DC=somecorp,DC=org', 
'whenCreated': '20061027132244.0Z', 
'department': 'WHSE', 
'sAMAccountName': 'ejones', 
'manager': 'CN=Bobby Smith,OU=WHSE,OU=GU,DC=jupiter,DC=somecorp,DC=org'
}
  

Мы используем среду python 3.8.

Есть предложения?

Комментарии:

1. Это списки, потому что некоторые атрибуты могут иметь несколько значений. Если встречается что-то подобное [b"foo", b"bar"] , какой должна быть результирующая строка? Кроме того, в какой кодировке находятся эти байтовые строки? utf-8, текущая кодовая страница?

2. Спасибо за вопрос. Я проверил всю нашу выписку ldap. К счастью, у нас нет многозначных атрибутов. Стандартом LDAP является кодовая страница utf-8.

Ответ №1:

Это должно сделать это:

 S = {'sn': [b'Jones'], 'title': [b'WH Trainee'], 'givenName': [b'Example'], 'distinguishedName': [b'CN=Example Jones,OU=Warehouse Trainees,OU=GU,DC=jupiter,DC=somecorp,DC=org'], 'whenCreated': [b'20201027121144.0Z'], 'department': [b'WHSE'], 'sAMAccountName': [b'ejones'], 'manager': [b'CN=Bobby Smith,OU=WHSE,OU=GU,DC=jupiter,DC=somecorp,DC=org']}

dt = {key: value[0].decode("utf-8") for key, value in S.items()}
print(dt)
  

Вывод:

 {
    "sn": "Jones",
    "title": "WH Trainee",
    "givenName": "Example",
    "distinguishedName": "CN=Example Jones,OU=Warehouse Trainees,OU=GU,DC=jupiter,DC=somecorp,DC=org",
    "whenCreated": "20201027121144.0Z",
    "department": "WHSE",
    "sAMAccountName": "ejones",
    "manager": "CN=Bobby Smith,OU=WHSE,OU=GU,DC=jupiter,DC=somecorp,DC=org"
  }
  

Комментарии:

1. Большое вам спасибо! Я пробовал вариант этого и имел несколько серьезных синтаксических ошибок. Я ценю помощь.