0

我想从 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)

有人可以帮我解决这个问题吗?

4

1 回答 1

0

始终停止将数据编码为 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Ž

注意第一个字符串的最后一个字符是无效的;它缺少一个字节!这是因为在正确的 CP1252 编解码器中“解码”最后一个字符的 UTF-8 字节的结果是不可能的。我不得不使用ftfy项目内部修复编解码器来绕过这个问题:

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

解决此问题的唯一方法是 a) 确保您使用正确的编解码器读取数据,并且 b) 然后在整个代码中将所有文本视为 Unicode,并且仅在最后一刻编码为正确的输出编解码器。

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

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

你可能想阅读 Python 和 Unicode:

于 2015-03-18T12:58:46.963 回答