LINUX.ORG.RU

Кодировки в Python 2.

 , ,


0

3

Всем привет! Уверен что платина, но поиском ничего не нашел. Есть такой несложный код, который открывает .csv и создает список из указанных колонок.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

f = open('/var/tmp/test.csv','r')
try:
    reader = csv.reader(f)
    next(reader)
    for i in reader:
        name.append(i[0])
        login.append(i[1])
        password.append(''.join(random.sample(alphabet, 8)))
finally:
    f.close()
list = zip(name,login,password)
print list
Однако, когда пытаешься новый список распечатать, получаю : \xd0\x9a\xd0\xbe\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0 и т.д. Но если печатать:
for i in name:
    print i
то все нормально. В чем тут может быть дело?


Ответ на: комментарий от gadzira

Всё ок при выводе в терминал не показатель. Попробуй len своих строк. Вот пример (python2):

In [1]: len('тест')
Out[1]: 8

In [2]: len('тест'.decode('utf-8'))
Out[2]: 4
AlexKiriukha ★★★★
()

print выводит нормально только сами строки, а при выводе прочих объектов, их содержащих (как данный список) они представляются в hex-виде. На вывод список списков/кортежей строк надо пускать как-то так:

for rec in list:
    print '"'+'", "'.join(rec)+'"'
vsemnazlo
()

Почитай про Юникод и UTF-8. Сначала на вики, а потом в доках питона. Смысл в том, что у тебя питон не знает заранее что ему подсовывают при отпечатке листа. То-ли обычные строки, то-ли юникод. https://docs.python.org/2/howto/unicode.html

menangen ★★★★★
()
Ответ на: комментарий от vsemnazlo

Ага, работает! осталось понять почему.

gadzira
() автор топика

В чем тут может быть дело?

У list'а нет str-представления, то есть когда ты делаешь

print list

то на самом деле ты делаешь

print repr(list)

Соответственно для дочерних элементов list'а тоже вызывается repr.

Вывод любого объекта требует его сериализации, дефолтный способ сериализации в питоне - repr. Это понятно?

ei-grad ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.