Найти - Пользователи
Полная версия: частное решение проблем с кодировкой в python 2.6 вывод списка
Начало » Python для новичков » частное решение проблем с кодировкой в python 2.6 вывод списка
1
beliy_shum
# -*- coding: utf-8 -*-

# вложенные списки
myList = [u'привет', [u'вот', [u'вот', [u'оно']]], u"этот", u"тот", [u"он", u"другой", [u'он', u'они']], u'вон']

def print_list(list_):
"""преобразует список вложенности до 4 в юникод строку.
не справляеться с пустыми списками."""
list_in_str=u''
list_in_str+= '['
for list1 in list_:
if isinstance(list1, list):
list_in_str+='['
for list2 in list1:
if isinstance(list2, list):
list_in_str+='['
for list3 in list2:
if isinstance(list3, list):
list_in_str+='['
for list4 in list3:
if isinstance(list4, list):
list_in_str+='['
for list5 in list4:
if isinstance(list5, unicode):
list_in_str+= '\'' + list5 + '\', '
list_in_str=list_in_str[:-2]+'], '
else:
list_in_str+= '\'' + list4 + '\', '
list_in_str=list_in_str[:-2]+'], '
else:
list_in_str+= '\'' + list3 + '\', '
list_in_str=list_in_str[:-2]+'], '
else:
list_in_str+= '\'' + list2 + '\', '
list_in_str=list_in_str[:-2]+'], '
else:
list_in_str+= '\'' + list1 + '\', '
list_in_str=list_in_str[:-2]+']'
return list_in_str

str=print_list(myList)
print str.encode('cp1251')
>pythonw -u "seriyforumCod-ru.py"
['привет', ['вот', ['вот', ['оно']]], 'этот', 'тот', ['он', 'другой', ['он', 'они']], 'вон']
>Exit code: 0 Time: 0.209
beliy_shum
спасибо всем кто подсказал
а кстати в 2.6 оказывается нужно исходники писать в ascii http://www.python.org/dev/peps/pep-0008/
PooH
“Я хренею, дорогая редакция!” :) Вам такое понятие “рекурсия” знакомо?! Вот хотя бы так, навскидку:
def print_list(ls, encoding='utf-8'):
result = []
for x in ls:
if isinstance(x, list):
result.append(print_list(x, encoding))
elif isinstance(x, unicode):
result.append("'%s'" % x.encode(encoding))
else:
result.append(str(x))
return "[%s]" % ', '.join(result)
beliy_shum
знакомо. мне стыдно
спасибо.
только перекодировать советуют на выходе уже совсем.
regall
нужно запостить на govnokod.ru =)
beliy_shum
а как такой код? можно его существенно улучшить?
эта функция печатает словари/списки произвольной вложенности содержащие инт флоат юникод строки обычные строки
dl2 = { u'ругательства':{ u'блин': -1, u'пипец': -2}, 1:2,'строка': u'вот', u'юникод': 5, 777.5: 5.5, u'похвала': {u'молодец': 2}, u'чёрт':{u'весна': u'зима'}, 5:[u'1',u'2', ], 8: [[{ u'ругательства':{ u'блин': -1, u'пипец': -2}, 'строка': u'вот', u'юникод': 5, 777.5: 5.5, u'похвала': {u'молодец': 2}, u'чёрт':{u'весна': u'зима'}, 5:[u'1',u'2', ]},'5'], u'привет', [u'вот', [u'вот', [u'оно']]], 11.5, u'этот', u'тот', [u'вот', u'жесть'], [u'он', u'другой', [u'он', u'они']], {u'вон':8}]}

def print_list(list_, encoding='utf-8'):
"""возвращает юникод строку со списками"""

result = []
for x in list_:
if isinstance(x, list):
#print '[spisok]'
result.append(print_list(x))
elif isinstance(x, unicode):
#print "u'unistroka'"
result.append("'%s'" % x)
elif isinstance(x, str):
#print "'stroka'"
result.append("'%s'" % x.decode(encoding))
elif isinstance(x, int) or isinstance(x, float):
#print '12345678'
result.append("%s" % x)
elif isinstance(x, dict):
#print '[slovar]'
result.append("%s" % print_dict(x))
else:
print '!!!!!!!!LIST!!!!!!!!!!!!!'
result.append(str(x))
return "[%s]" % ', '.join(result)

def print_dict(dict_, encoding='utf-8'):
"""возвращает юникод строку со словарями"""

result = []
for x in dict_:

#обработаем ключ
if isinstance(x, unicode):
#print 'kluch=unicode stroka'
result.append("'%s':" % x)
elif isinstance(x, str):
#print 'kluch=stroka'
result.append("'%s':" % x.decode(encoding))
elif isinstance(x, int) or isinstance(x, float):
#print 'kluch=chislo'
result.append("%s:" % x)
else:
print '!!!!!!!!!!!!!!!!!!!!!'
result.append(str(x))

#обработаем значение
if isinstance(dict_[x], dict):
#print 'znach=slovar'
result.append("%s" % print_dict(dict_[x]))
elif isinstance(dict_[x], str):
#print 'znach=stroka'
result.append("'%s'" % dict_[x].decode(encoding))
elif isinstance(dict_[x], unicode):
#print 'znach=unicodestroka'
result.append("'%s'" % dict_[x])
elif isinstance(dict_[x], int) or isinstance(dict_[x], float):
#print 'znach=chislo'
result.append("%s" % dict_[x])
elif isinstance(dict_[x], list):
#print 'znach=list'
result.append("%s" % print_list(dict_[x]))
else:
print '!!!!!!!!!!DICT!!!!!!!!!!!'
result.append(str(x))
h="{%s}" % ', '.join(result)
h=string.replace(h, ":,", ':')#грязный хак(
return h


#собственно функция
def print_dl(dl,encoding='utf-8'):
"""эта функция печатает словари/списки произвольной вложенности содержащие инт флоат юникод строки обычные строки"""
if isinstance(dl, dict):
return print_dict(dl)
elif isinstance(dl, list):
print '555'
return print_list(dl)
else:
print '!!!!!error dl!!!!!!!!!!!!!'
ответ:
{777.5: 5.5, 1: 2, 'чёрт': {'весна': 'зима'}, 'строка': 'вот', 'похвала': {'молодец': 2}, 'ругательства': {'блин': -1, 'пипец': -2}, 8: [[{777.5: 5.5, 'чёрт': {'весна': 'зима'}, 'строка': 'вот', 5: ['1', '2'], 'ругательства': {'блин': -1, 'пипец': -2}, 'похвала': {'молодец': 2}, 'юникод': 5}, '5'], 'привет', ['вот', ['вот', ['оно']]], 11.5, 'этот', 'тот', ['вот', 'жесть'], ['он', 'другой', ['он', 'они']], {'вон': 8}], 'юникод': 5, 5: ['1', '2']}
проверяем пиотоном 3,1:
{777.5: 5.5, 1: 2, 'чёрт': {'весна': 'зима'}, 'похвала': {'молодец': 2}, 'ругательства': {'блин': -1, 'пипец': -2}, 8: [[{777.5: 5.5, 'чёрт': {'весна': 'зима'}, 5: ['1', '2'], 'ругательства': {'блин': -1, 'пипец': -2}, 'строка': 'вот', 'похвала': {'молодец': 2}, 'юникод': 5}, '5'], 'привет', ['вот', ['вот', ['оно']]], 11.5, 'этот', 'тот', ['вот', 'жесть'], ['он', 'другой', ['он', 'они']], {'вон': 8}], 'юникод': 5, 'строка': 'вот', 5: ['1', '2']}
qwer
неэффективно.
можно объединить в одной функции obj2str(obj, enc), зачем разные ?
def obj2str(obj, enc):
result = ''
if isinstance(obj, list):
result += '['
for item in obj:
result += obj2str(item) + ','
if len(obj) > 0 : result = result[:-1]
result += ']'
elif isinstance(obj, dict):
result += '{'
for key,value in obj.items():
result += obj2str(key) + ':' + obj2str(value) + ','
if len(obj) > 0 : result = result[:-1]
result += '}'
elif isinstance(obj, (int,float,bool)): result = str(obj)
elif isinstance(obj, (str,unicode)): result = repr(obj)
else: result = str(obj)
return result
если использовать list comprehensions, код можно еще сократить.
beliy_shum
qwer
спасибо большое)
beliy_shum
def obj2str(obj, encoding='utf-8'):
result = ''
if isinstance(obj, list):
result += '['
for item in obj:
result += obj2str(item) + ', '
if len(obj) > 0 : result = result[:-2]
result += ']'
elif isinstance(obj, dict):
result += '{'
for key,value in obj.items():
result += obj2str(key) + ': ' + obj2str(value) + ', '
if len(obj) > 0 : result = result[:-2]
result += '}'
elif isinstance(obj, (int,float,bool)): result = str(obj)
elif isinstance(obj, str): result = obj.decode(encoding)
elif isinstance(obj, unicode): result = obj
else: result = str(obj)
return result
вот так всё работает

elif isinstance(obj, str): result = obj.decode(encoding)
elif isinstance(obj, unicode): result = obj
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB