Чтение символов из файла в Python
в текстовом файле есть строка "мне это не нравится".
однако, когда я читаю его в строку, он становится "я неxe2x80x98t, как это". Я понимаю, что u2018-это unicode-представление"'". Я использую
f1 = open (file1, "r")
text = f1.read()
команда для чтения.
теперь, можно ли прочитать строку таким образом, что когда она читается в строку, это "мне это не нравится", а не "я неxe2x80x98t, как это нравится это"?
второе редактирование: я видел, как некоторые люди используют сопоставление для решения этой проблемы, но на самом деле, нет ли встроенного преобразования, которое делает этот вид преобразования ANSI в unicode ( и наоборот)?
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, попробуйте одно из следующих действий:
замените определенные символы юникода на эквиваленты ASCII, если вы хотите обрабатывать только несколько особых случаев, таких как этот конкретный пример
использовать
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