Нормализация юникода в наборе данных

В настоящее время мой код следующий:

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

где unicode.txt — это текстовый файл, который просто читается как \u00e9.

Когда я запускаю программу, вывод по-прежнему \u00e9, однако, если я заменю unicode в строке .normalize на \u00e9, вывод будет é.

Конечная цель — просто заменить все строки Юникода (например, é) их обычными символами. Как cafe вместо café.

Функция нормализации работает нормально, когда строка вводится в функцию, но не когда она находится в открываемом файле. Даже в этом случае кажется, что она возвращает стилизованное é вместо обычного e.

Есть ли способ заставить это работать?


person Janan Lim    schedule 23.10.2018    source источник
comment
Я не совсем уверен: какое преобразование вам нужно? а) \u00e9é, б) ée, в) \u00e9e? Ответ Марка поможет вам с а). Преобразование б) называется транслитерацией (не нормализацией), и пакет unidecode может вам помочь. Для c) объедините a) и b).   -  person lenz    schedule 24.10.2018


Ответы (2)


Содержимое файла состоит буквально из шести символов: \u0029. '\u0029' введенный код представляет собой одну кодовую точку Unicode, представленную в виде escape-кода:

>>> 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 необходима для преобразования строки символов Unicode, состоящей из символов ASCII, в строку байтов, потому что в Python 3 можно декодировать только строки байтов. Python 2 может пропустить его, поскольку при необходимости он неявно кодирует строки Unicode обратно в ASCII.
Вы можете также напрямую прочитайте его из файла (при условии, что Python 3) с помощью:

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

Используйте import io и io.open на Python 2.

person Mark Tolonen    schedule 24.10.2018

Я думаю, вы можете изменить его на 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 пытается нормализовать юникод в строке не по символу. Надеюсь, это поможет.

Ссылки: 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

person jeo    schedule 16.03.2021