Вопрос

В текстовом файле есть строка «Мне это не нравится».

Однако, когда я читаю это в строку, получается: «Мне это не нравится\xe2\x80\x98t».Я понимаю, что \u2018 — это представление «'» в Юникоде.я использую

f1 = open (file1, "r")
text = f1.read()

команда для чтения.

Теперь, можно ли прочитать строку таким образом, чтобы при чтении в строку было «Мне это не нравится» вместо «Мне не нравится\xe2\x80\x98t вот так»?

Второе редактирование:Я видел, как некоторые люди использовали сопоставление для решения этой проблемы, но на самом деле, нет ли встроенного преобразования, которое выполняло бы такое преобразование ANSI в Unicode (и наоборот)?

Это было полезно?

Решение

Ссылка: http://docs.python.org/howto/unicode

Таким образом, чтение Unicode из файла выполняется просто:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

Также возможно открывать файлы в режиме обновления, допуская как чтение, так и запись:

f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

РЕДАКТИРОВАТЬ:Я предполагаю, что ваша предполагаемая цель — просто правильно прочитать файл в строку в Python.Если вы пытаетесь преобразовать строку ASCII из Unicode, то на самом деле нет прямого способа сделать это, поскольку символы Unicode не обязательно будут существовать в ASCII.

Если вы пытаетесь преобразовать в строку ASCII, попробуйте одно из следующих действий:

  1. Замените определенные символы Юникода эквивалентами ASCII, если вы хотите обработать только несколько особых случаев, таких как этот конкретный пример.

  2. Использовать unicodedata модуль normalize() и string.encode() метод для наилучшего преобразования в следующий ближайший эквивалент ASCII (см. https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    

Другие советы

Есть несколько моментов, которые следует учитывать.

Символ \u2018 может появляться только как фрагмент представления строки Юникода в Python, например.если вы напишете:

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

Теперь, если вы просто хотите красиво напечатать строку Юникода, просто используйте encode метод:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

Чтобы быть уверенным, что каждая строка любого файла будет читаться как юникод, лучше использовать команду codecs.open функция, а не просто open, который позволяет указать кодировку файла:

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this

Но на самом деле это «Мне это не нравится», а не «Мне это не нравится».Символ u'\u2018' — это совершенно другой символ, чем "'" (и визуально он должен больше соответствовать '`').

Если вы пытаетесь преобразовать закодированный Юникод в простой ASCII, возможно, вы могли бы сохранить отображение знаков препинания Юникода, которые вы хотели бы перевести в ASCII.

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

Есть очень много знаки пунктуации в Юникоде, однако я полагаю, что вы можете рассчитывать на то, что лишь некоторые из них действительно будут использоваться любым приложением, создающим документы, которые вы читаете.

Оставляя в стороне тот факт, что ваш текстовый файл поврежден (U+2018 — это левая кавычка, а не апостроф):iconv можно использовать для транслитерации символов Юникода в ascii.

Вам придется поискать в Google «iconvcodec», так как этот модуль, похоже, больше не поддерживается, и я не могу найти для него каноническую домашнюю страницу.

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

В качестве альтернативы вы можете использовать iconv Утилита командной строки для очистки вашего файла:

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

Существует вероятность того, что у вас каким-то образом есть строка, отличная от Юникода, с escape-символами Юникода, например:

>>> print repr(text)
'I don\\u2018t like this'

Это действительно случилось со мной однажды.Вы можете использовать unicode_escape кодек для декодирования строки в Юникод, а затем закодируйте ее в любой нужный вам формат:

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this

Это способ Pythons показать вам строки в кодировке Unicode.Но я думаю, что вы сможете без проблем распечатать строку на экране или записать ее в новый файл.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

На самом деле U+2018 — это представление в Юникоде специального символа ‘ .Если хотите, вы можете преобразовать экземпляры этого символа в U+0027 с помощью этого кода:

text = text.replace (u"\u2018", "'")

Кроме того, что вы используете для записи файла? f1.read() должен вернуть строку, которая выглядит следующим образом:

'I don\xe2\x80\x98t like this'

Если он возвращается этот строка, файл пишется неправильно:

'I don\u2018t like this'

Также можно прочитать закодированный текстовый файл, используя метод чтения Python 3:

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

Благодаря этому варианту нет необходимости импортировать какие-либо дополнительные библиотеки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top