2015-03-18 4 views
0

Я хочу прочитать несколько слов из файла excel и извлечь некоторую информацию. Чтение файла без проблем.Python: приращение специального символа Í

Дело в том, что я хочу увеличить последний символ слова. Для обычных символов, таких как A, это не проблема. Но специальные символы, такие как «Í», являются проблемой.

Я прочитал содержание с этим:

val = val.encode('utf-8') 

Я ставлю это значение в словаре.

Следующим шагом является итерация по dict и получение сохраненной информации. info ['streettype'] содержит мой val из ранее. Теперь я преобразовать значение в верхнем регистре, как это:

w2 = info['streettype'].decode('utf-8').upper().encode('utf-8') 

Это необходимо потому, что некоторые символы являются особенными, как я уже говорил (например, «é», «Z», «I»). Теперь я хочу увеличить последний символ слова, который может быть особым символом.

w3 = w2.decode('utf-8')[:-1].encode('utf-8')  
lastLetter = w2.decode('utf-8')[-1].encode('utf-8') 

Теперь я увеличиваю персонажа с помощью:

lastLetter2 = (chr(ord(lastLetter.decode('utf-8')) + 1)) 

Далее я хочу сохранить его в текстовом файле. Я хочу сохранить исходное слово и отредактированное слово. Мне кажется, мне нужно переписать мой lastLetter2, но он не работает. Когда я просто сохраняю свои w2 и w3 + lastLetter2, я получаю странные результаты, потому что некоторые из них закодированы, а некоторые нет.

Для слова:

NÁBŘEŽÍ 

мой результат:

"NÃBŘEŽÃ", "NÃBŘEŽÎÃ" 

, но я хочу:

"NÁBŘEŽÍ", "NÁBŘEŽÎ" 

(Н является ASCII 205, я это ASCII 206)

Может кто-нибудь помочь мне сохранить это проблема?

+1

не работают (конкатенации, символы изменения) на закодированных строк. Работайте по юникодным (декодированным) строкам и ** кодируйте только после того, как вы закончите ** – goncalopp

+4

* Í is ascii 205, is is ascii 206 *. Нет, они не. Эти символы ** не входят в стандарт ASCII **, который имеет только 128 кодовых точек. Это символы iso-8859-1 (Latin-1), и в стандарте * * * они действительно закодированы до 205 и 206. Они также имеют одинаковый * Unicode * код. –

+0

Вы используете Python 2 или 3 здесь? –

ответ

0

Остановить кодирование ваших данных до UTF-8 все время; сохраните текст как Unicode, он упрощает обработку. Оставляйте кодировку до последней минуты, желательно, используя файл file, запишите это для вас.

Наличие кодировки файла Unicode означает, что в Python 2 вы должны использовать io.open(), а не стандартную встроенную функцию open(); это та же инфраструктура, которую использует Python 3 для обработки Unicode и ввода-вывода файлов.

Вы можете создать Mojibake путем кодирования и декодирования по желанию здесь; текст теперь сочетание данных UTF8 декодируется с ОС Windows 1252, то кодировке, кодируемого в UTF8 снова, плюс, не искаженной данных:

>>> print u'NÃBŘEŽÃ' 
NÃBŘEŽà 
>>> print u'NÃBŘEŽÃ'[3:-1].encode('cp1252').decode('utf8') 
ŘEŽ 

Обратите внимание, что последний символ в первой stringis недействительным; ему не хватает байта!Это связано с тем, что результат «декодирования» байтов UTF-8 последнего символа не должен быть возможен в правильном кодеке CP1252; Я должен был использовать ftfy project внутренние кодеки ремонт, чтобы обойти эту проблему:

>>> print u'NÃBŘEŽÃ\x8d'[3:].encode('sloppy-cp1252').decode('utf8') 
ŘEŽÍ 
>>> u'Í'.encode('utf8').decode('cp1252') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp1252.py", line 15, in decode 
    return codecs.charmap_decode(input,errors,decoding_table) 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 1: character maps to <undefined> 
>>> u'Í'.encode('utf8').decode('sloppy-cp1252') 
u'\xc3\x8d' 
>>> print u'Í'.encode('utf8').decode('sloppy-cp1252') 
à 

Единственный способ исправить это: а) убедиться, что вы читать ваши данные, используя правильные кодеки и б) затем обрабатывают все текст как Unicode на весь ваш код и только в последний момент кодировать правильный выходной кодек.

Обработка Unicode точек кода с ord() и unichr() (in Python 2) и chr() in Python 3 будет работать, как ожидалось:

>>> lastletter = u'Î' 
>>> ord(lastletter) 
206 
>>> unichr(ord(lastletter) + 1) 
u'\xcf' 
>>> print unichr(ord(lastletter) + 1) 
Ï 

Вы можете прочитать на Python и Unicode:

Смежные вопросы