Python: 递增特殊字符 Í

Python: increment special character Í

我想从 excel 文件中读取一些单词并提取一些信息。 读取文件没问题

重点是,我想递增单词的最后一个字符。 'A'这样的普通字符是没有问题的。但是像'Í'这样的特殊字符是个问题。

我阅读的内容是这样的:

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))

接下来我想将它保存在一个文本文件中。 我想保存原始单词和编辑后的单词。 我想我需要重新编码我的 lastLetter2,但它不起作用。 当我只保存我的 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 意味着在 Python 2 中您将使用 io.open() 而不是标准的内置 open() 函数;这与 Python 3 用于处理 Unicode 和文件 I/O.

的基础设施相同

你在这里随意编解码成功创造了一个Mojibake;您的文本现在是使用 Windows 代码页 1252 解码然后再次编码为 UTF8 的 UTF-8 数据的混合,加上未损坏的数据:

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

注意第一个字符串的最后一个字符无效;它缺少一个字节!那是因为 'decoding' 最后一个字符的 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/Whosebug-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')
Ã

解决此问题的唯一方法是 a) 确保使用 正确的编解码器 读取数据,以及 b) 然后处理 所有文本 在你的代码中作为 Unicode,并且只在最后一刻编码为正确的输出编解码器。

使用 ord() and unichr() (in Python 2) and chr() in Python 3 处理 Unicode 代码点将按预期工作:

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

您可能需要阅读 Python 和 Unicode: