在这个笔记本中,我们将处理不同的字符编码。
本节课数据集下载链接:https://pan.quark.cn/s/da981fb2fc97
让我们开始吧!
我们需要做的第一件事是加载我们将要使用的库。但我们的数据集还没有准备好:我们稍后再处理它!
In [1]:
# 我们将使用的模块
import pandas as pd
import numpy as np
# 有用的字符编码模块
import charset_normalizer
# 设置种子以保证可重复性
np.random.seed(0)
什么是编码? 字符编码是从原始二进制字节串(看起来像这样:0110100001101001)到构成人类可读文本的字符的映射规则的特定集合(比如 “hi”)。有许多不同的编码,如果你试图用一个与最初写入的编码不同的编码来读取文本,你最终得到的是被打乱的文本,称为 “mojibake”(发音为 mo-gee-bah-kay)。下面是一个 mojibake 的例子:
æ–‡å—化ã??
你也可能会遇到 “未知” 字符。当没有映射关系存在于你用来读取字节串的编码中的特定字节和字符时,就会打印出这些字符,它们看起来像这样:
����������
字符编码不匹配的问题现在比过去少见了,但它绝对仍然是一个问题。有许多不同的字符编码,但你需要知道的主要编码是 UTF-8。
UTF-8 是标准的文本编码。所有的 Python 代码都是 UTF-8 编码的,理想情况下,你的所有数据也应该是这样。当事情不是 UTF-8 编码时,你就会遇到麻烦。
在 Python 2 中处理编码是相当困难的,但值得庆幸的是,在 Python 3 中,这变得简单得多。(Kaggle 笔记本只使用 Python 3。)在 Python 3 中处理文本时,你将遇到两种主要的数据类型。一种是字符串,这是文本的默认类型。
In [2]:
# 从一个字符串开始
before = "This is the euro symbol: €"
# 检查它的数据类型
type(before)
str
Out[2]:
str
另一种数据类型是字节数据类型,它是整数的序列。你可以通过指定它的编码来将字符串转换为字节:
In [3]:
# 将其编码为不同的编码,替换引发错误的字符
after = before.encode("utf-8", errors="replace")
# 检查类型
type(after)
bytes
Out[3]:
bytes
如果你看一个字节对象,你会看到它前面有一个 b,然后可能还有一些文本。这是因为字节被打印出来就像它们是 ASCII 编码的字符。(ASCII 是一个较旧的字符编码,它不能真正用于写任何语言,除了英语。)在这里,你可以看到我们的欧元符号被替换成了一些看起来像 “\xe2\x82\xac” 的 mojibake,当它被打印出来就像它是一个 ASCII 字符串。
In [4]:
# 看看字节是什么样子的
after
Out[4]:
b'This is the euro symbol: \xe2\x82\xac'
当我们将我们的字节用正确的编码转换回字符串时,我们可以看到我们的文本都在那里,这很棒!
In [5]:
# 将其转换回 utf-8
print(after.decode("utf-8"))
This is the euro symbol: €
然而,当我们试图使用不同的编码来将我们的字节映射到字符串时,我们会得到一个错误。这是因为我们试图使用的编码不知道如何处理我们试图传递给它的字节。你需要告诉 Python 字节串实际应该是什么编码。
你可以把不同的编码想象成不同的录音方式。你可以在 CD、磁带或 8 轨录音带上录制同样的音乐。虽然音乐可能听起来差不多,但你需要使用正确的设备来播放每种录音格式的音乐。正确的解码器就像一个磁带播放器或 CD 播放器。如果你试图在 CD 播放器中播放磁带,那就不会工作。
In [6]:
# 尝试用 ascii 编码解码我们的字节
print(after.decode("ascii"))
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/tmp