Чтение символов из файла в Python



в текстовом файле есть строка "мне это не нравится".



однако, когда я читаю его в строку, он становится "я неxe2x80x98t, как это". Я понимаю, что u2018-это unicode-представление"'". Я использую



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


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



теперь, можно ли прочитать строку таким образом, что когда она читается в строку, это "мне это не нравится", а не "я неxe2x80x98t, как это нравится это"?



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

602   7  

7 ответов:

Ref:http://docs.python.org/howto/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()

EDIT: я предполагаю, что ваша предполагаемая цель-просто правильно прочитать файл в строку на Python. Если вы пытаетесь преобразовать в строку ASCII из Unicode, то на самом деле нет прямого способа сделать это, так как символы Unicode не обязательно будут существовать в ASCII.

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

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

  2. использовать unicodedata модуль normalize() и string.encode() метод для преобразования как лучше всего вы можете к следующему ближайшему эквиваленту ASCII (Ref 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 может отображаться только как фрагмент представления строки unicode в Python, например, если вы пишете:

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

теперь, если вы просто хотите напечатать строку unicode красиво, просто используйте unicode encode способ:

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

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

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

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

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

их очень много знаки препинания в Unicode, однако, но я предположим, вы можете рассчитывать только на некоторые из них, фактически используемые любым приложением, создающим документы, которые Вы читаете.

оставляя в стороне тот факт, что ваш текстовый файл сломан (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                                     '.

есть вероятность, что каким-то образом у вас есть строка не unicode с escape-символами unicode, например:

>>> 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

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

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

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

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

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

'I don\u2018t 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

Comments

    Ничего не найдено.