Низът променя кодирането си, след като е добавен към списъка

Хубав ден на всички!

Първо, името на темата всъщност не е това, което се случва. Но не можах да измисля нищо по-добро! Имам много прост случай и не мога да разбера защо се държи така:

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 екранирани символи. Свързани: 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 непечатаемите кодови точки или; те току-що са били кодирани с помощта на механизмите за бягство на Python. Все още можете да възстановите оригиналните стойности на байтове, като използвате ast.literal_eval() например. Не че е добра идея, нито е много оперативно съвместима с други инструменти.   -  person Martijn Pieters    schedule 29.04.2014
comment
@ Martijn Pieters: Благодаря за съвета! Използвах ast.literal.eval() на много места преди, но никога за възстановяване на байтове.   -  person Desprit    schedule 29.04.2014
comment
@ Martijn Pieters: Да, това проработи за мен. Ще използвам literal.eval в този случай! Благодаря ти!!   -  person Desprit    schedule 29.04.2014