Строка изменяет свою кодировку после добавления в список

Добрый день всем!

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

name = 'Balikóné'
seq = []
seq.append(name)

print name
print seq[0]
print seq

Вот результат:

Balikóné
Balikóné
['Balik\xc3\xb3n\xc3\xa9']

Я использую Python 2.7.5. В качестве первой строки моего кода у меня есть

# -*- coding: utf-8 -*-

чтобы python понял, что у меня есть некоторые «недопустимые» символы ascii в моей строке. В противном случае я получаю:

Non-ASCII character '\xc3' in file 'my_path', but no encoding declared

Почему это выглядит по-разному, когда я печатаю список и элемент из списка?


person Desprit    schedule 29.04.2014    source источник
comment
Нет, строка никогда не меняла свою кодировку. Ваш терминал интерпретировал кодировку и вместо этого отображал кодовые точки, которые вы узнали.   -  person Martijn Pieters    schedule 29.04.2014
comment
Когда вы печатаете список, вы получаете repr элементов в списке, который для байтов, отличных от ASCII, показывает их как \x escape-последовательности. Связанный: stackoverflow.com/questions/17560620/   -  person Wooble    schedule 29.04.2014
comment
Но есть ли возможность сохранить этот [seq] теперь как файл, не теряя не-ASCII?   -  person Desprit    schedule 29.04.2014
comment
@Desprit: символы уже были закодированы (в UTF8), поэтому вы можете без проблем записать эти строки байтов в файл.   -  person Martijn Pieters    schedule 29.04.2014
comment
@Martijn Pieters: Если записать весь [seq] в файл, я получу тот же результат: ['Balik\xc3\xb3n\xc3\xa9'] Единственное, что работает - запись в файл не всего [seq], а [seq][item] один за другим...   -  person Desprit    schedule 29.04.2014
comment
@Desprit: конечно, но это потому, что вы записываете str(listobj) в файл так же, как print пишет в stdout. Вы получаете строковое представление объекта Python. Это другой вопрос; не записывайте списки непосредственно в файл.   -  person Martijn Pieters    schedule 29.04.2014
comment
@Martijn Pieters: Так это единственный способ записать в файл, не теряя не-ascii, верно?   -  person Desprit    schedule 29.04.2014
comment
Кстати, в Python 2.7 вы должны отмечать текстовые строки знаком u в начале: name = u'Balikóné' вместе с битом # -*- coding. bit.ly/unipain полезно смотреть и/или читать.   -  person Wooble    schedule 29.04.2014
comment
Спасибо @Wooble и @Martijn Pieters за ссылки, я прочитаю их, чтобы лучше понять всю эту кодировку.   -  person Desprit    schedule 29.04.2014
comment
@Desprit: есть много способов. Запись всего объекта списка в файл технически не приводит к потере непечатаемых кодовых точек, отличных от ASCII, также; они только что были закодированы с использованием механизмов escape-последовательности Python. Вы все еще можете восстановить исходные значения байтов, например, используя ast.literal_eval(). Не то, чтобы это была хорошая идея и не очень совместимая с другими инструментами.   -  person Martijn Pieters    schedule 29.04.2014
comment
@ Мартин Питерс: Спасибо за совет! Раньше я использовал ast.literal.eval() во многих местах, но никогда не восстанавливал байты.   -  person Desprit    schedule 29.04.2014
comment
@ Мартин Питерс: Да, мне это помогло. В этом случае я буду использовать literal.eval! Спасибо!!   -  person Desprit    schedule 29.04.2014