标准化数据集中的unicode

时间:2018-10-23 15:27:05

标签: python unicode normalize

当前我的代码如下:

import unicodedata
unicode = open("unicode.txt").read()
unicode = unicodedata.normalize('NFKC', unicode)
print(unicode)

其中unicode.txt是仅读取\u00e9的文本文件。

运行程序时,输出仍为\u00e9,但是,如果我将.normalize行中的unicode替换为\u00e9,则输出为é。 / p>

最终目标只是将所有unicode字符串(例如\ u00e9)替换为其常规字符。像cafe而不是café

将字符串输入到函数中时,normalize函数似乎可以正常工作,但是在要打开的文件中时则无法正常工作。即使那样,它仍返回风格化的é而不是常规的e

有什么办法可以使这项工作成功吗?

2 个答案:

答案 0 :(得分:1)

文件的内容实际上是六个字符:\u0029。键入代码的'\u0029'是表示为转义代码的单个Unicode代码点:

>>> print('\u00e9')   # A single character escape code
é
>>> print(r'\u0039')  # A six-character string using raw string notation.
\u0039                # Escape codes are ignored and characters are literal.
>>> print('\\u0039')  # A six-character string using an escaped backslash
\u0039                # to indicate a literal backslash.

要将六个字符的字符串转换为字符,请使用以下命令

>>> r'\u00e9'.encode('ascii').decode('unicode-escape')
'é'

需要ascii编码将ASCII字符的Unicode字符串转换为字节字符串,因为您只能在Python 3中解码字节字符串。Python2可以跳过它,因为如果隐式将Unicode字符串编码回ASCII,需要。
您还可以使用以下命令直接从文件中读取该文件(假设使用Python 3):

with open('unicode.txt',encoding='unicode-escape') as f:
    data = f.read()

在Python 2上使用import ioio.open

答案 1 :(得分:0)

我想您可以将其更改为 readline() 或 readlines()。 代码将是:

import unicodedata
unicode = open("unicode.txt", 'r')
for ln in unicode.readlines():
    ln = unicodedata.normalize('NFKC', ln)
    print(ln)

原因是因为 read() 会分别处理文件中的每个字符,这意味着每个字符都会发生迭代。同时, readline 或 readlines() 将处理一行或整行的迭代。

但是,unicodedata 尝试将字符串中的 unicode 规范化,而不是按照字符进行规范化。希望会有所帮助。

参考资料: https://www.tutorialspoint.com/what-are-the-differences-between-readline-and-readlines-in-selenium-with-python https://discuss.codecademy.com/t/what-is-difference-between-read-and-readlines-in-python/478934