Python:递增特殊字符Í;
我想从excel文件中读取一些单词并提取一些信息。 读取文件没有问题 重点是,我想增加单词的最后一个字符。对于像“A”这样的普通字符没有问题。但像“Í”这样的特殊角色是个问题 我是这样读内容的:Python:递增特殊字符Í;,python,utf-8,special-characters,mojibake,Python,Utf 8,Special Characters,Mojibake,我想从excel文件中读取一些单词并提取一些信息。 读取文件没有问题 重点是,我想增加单词的最后一个字符。对于像“A”这样的普通字符没有问题。但像“Í”这样的特殊角色是个问题 我是这样读内容的: val = val.encode('utf-8') 我把这个值放在字典里 下一步是迭代dict并获取保存的信息。info['streettype']包含以前的val。现在我将值转换为大写形式,如下所示: w2 = info['streettype'].decode('utf-8').upper().e
val = val.encode('utf-8')
我把这个值放在字典里
下一步是迭代dict并获取保存的信息。info['streettype']包含以前的val。现在我将值转换为大写形式,如下所示:
w2 = info['streettype'].decode('utf-8').upper().encode('utf-8')
这是必要的,因为有些字符是特殊的,就像我说的(例如“é”、“ž”、“í”)。
现在我想增加单词的最后一个字符,它可以是一个特殊字符
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))
接下来我想把它保存在一个文本文件中。
我想保存原始单词和编辑过的单词。
我想我需要重新编码我的最后一封信2,但它不起作用。
当我保存我的w2和w3+lastLetter2时,我得到了奇怪的结果,因为有些是编码的,有些不是
这个词:
NÁBŘEŽÍ
我的结果是:
"NÃBŘEŽÃ", "NÃBŘEŽÎÃ"
但我想:
"NÁBŘEŽÍ", "NÁBŘEŽÎ"
(Í是ascii 205,Î是ascii 206)
有人能帮我解决这个问题吗?停止一直将数据编码到UTF-8;将文本保持为Unicode,这样处理起来就容易多了。将编码留待最后一分钟,最好让文件对象为您编码 将文件编码为Unicode意味着在Python2中,您将使用标准内置的
open()
函数;这与Python3用于处理Unicode和文件I/O的基础结构相同
您在这里随意编码和解码,成功地创建了一个;您的文本现在是使用Windows代码页1252解码的UTF-8数据的混合体,然后再次编码为UTF8,再加上未损坏的数据:
>>> print u'NÃBŘEŽÃ'
NÃBŘEŽÃ
>>> print u'NÃBŘEŽÃ'[3:-1].encode('cp1252').decode('utf8')
ŘEŽ
请注意,第一个字符串中的最后一个字符无效;它缺少一个字节!这是因为“解码”最后一个字符的UTF-8字节的结果在一个合适的CP1252编解码器中是不可能的;我不得不使用内部修复编解码器来绕过这个问题:
>>> 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')
Ã
您可能想了解Python和Unicode:
- 内德·巴奇尔德
- 乔尔斯波尔斯基
>>> lastletter = u'Î'
>>> ord(lastletter)
206
>>> unichr(ord(lastletter) + 1)
u'\xcf'
>>> print unichr(ord(lastletter) + 1)
Ï