Форум сайта python.su
Здравствуйте, я полный ноль в Python (наверное часто это пишут)
На работе внедряю IP-телефонию и решил сделать телефонную книгу, для этого решил брать информацию из Active Directory и сразу же столкнулся с проблемой.
С помощью библиотеки ldap3 я подключаюсь к AD и вывожу в консоль нужную информацию, однако данные на английском языке выводятся без проблем, но русский выводится в виде Unicode.
Как мне преобразовать полученную кашу в читабельный вид?
Получаю вот такую ерунду
"entries": [ { "attributes": { "name": "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432", "telephoneNumber": "105" }, },
Отредактировано artisstm (Дек. 8, 2017 15:59:31)
Офлайн
Поставь третий питон.
>>> s = "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432" >>> s 'Артем Зверев' >>>
Офлайн
После выходных решил проверить, вот что выдает sys.version
3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36)
Если что - я работаю в PyCharm
upd. Проверил сейчас в консоли питона - тоже самое
Отредактировано artisstm (Дек. 11, 2017 07:43:09)
Офлайн
При этом если строку добавить в переменную и вывести на экран, как сделали вы, то все отлично
Офлайн
>>> data = \ ... { ... "attributes": { ... "name": "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432", ... "telephoneNumber": "105" ... } ... } >>> >>> data {'attributes': {'name': 'Артем Зверев', 'telephoneNumber': '105'}} >>>
Отредактировано py.user.next (Дек. 11, 2017 08:18:43)
Офлайн
from ldap3 import Server, Connection, AUTO_BIND_NO_TLS, SUBTREE def get_ldap_info(): with Connection(Server('SERVER_IP', port=389, use_ssl=False), auto_bind=AUTO_BIND_NO_TLS, user='DOMAIN\\User', password='Pass') as c: c.search(search_base='OU=OU,OU=OU,DC=CORP,DC=CORP,DC=ru', search_filter='(&(objectClass=user))', search_scope=SUBTREE, attributes=['name', 'telephoneNumber'], get_operational_attributes=True) print(c.response_to_json()) get_ldap_info()
Офлайн
Вывел через print(c.entries) и все заработало, буду думать как это теперь в нужном мне виде вывести
Спасибо за помощь, если подскажете, как имя и телефон в переменную присвоить - буду счастлив
Офлайн
http://ldap3.readthedocs.io/connection.html#responses
Responses are received and stored in the connection.response as a list of dictionaries. You can get the search result entries of a Search operation iterating over the response attribute.
>>> import json >>> >>> data_string = """[{"abc": 1, "абв": 2}]""" >>> >>> print(json.dumps(json.loads(data_string))) [{"abc": 1, "\u0430\u0431\u0432": 2}] >>> >>> print(json.dumps(json.loads(data_string), ensure_ascii=False)) [{"abc": 1, "абв": 2}] >>>
>>> import json >>> >>> s = """[{"abc": 1, "\\u0430\\u0431\\u0432": 2}]""" >>> >>> print(s) [{"abc": 1, "\u0430\u0431\u0432": 2}] >>> >>> json.loads(s) [{'abc': 1, 'абв': 2}] >>>
Отредактировано py.user.next (Дек. 11, 2017 09:34:47)
Офлайн
py.user.nextПонял, спасибо. Не буду глупые вопросы задавать, пойду читать интернеты
Зачем ты вообще читаешь данные в json? Этот формат не для человека сделан, а для компьютера. Поэтому разницы нет, как оно выглядит, главное, чтобы хранилось правильно.
Офлайн
Оставлю для кого нибудь то, что у меня вышло, думаю теперь как в html все это записать
[code python]from ldap3 import Server, Connection, AUTO_BIND_NO_TLS, SUBTREE
def get_ldap_info():
with Connection(Server('IP Адресс AD', port=389, use_ssl=False),
auto_bind=AUTO_BIND_NO_TLS,
user='Домин\\логин', password='Пароль') as c:
c.search(search_base='OU=ОУ,OU=ОУ,DC=corp,DC=ДС,DC=ru',
search_filter='(&(objectClass=user))',
search_scope=SUBTREE,
attributes=['name', 'telephoneNumber'],
get_operational_attributes=True)
for i in range(len(c.response)):
uname = str(c.response[i]['attributes']['name'])
uphone = str(c.response[i]['attributes']['telephoneNumber'])
if uphone[0] is '[':
print(uname + ' - Нет номера')
else:
print(uname + ' - ' + uphone)
get_ldap_info()[/code]
Офлайн