Символ, читающий из файла в Python

94
задан DzinX 8 October 2008 в 17:01
поделиться

7 ответов

Касательно: 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. Замена определенные unicode символы с эквивалентами 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'
    
146
ответ дан binarysubstrate 5 November 2019 в 13:16
поделиться

Существует несколько вопросов для рассмотрения.

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

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

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

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

, Чтобы удостовериться, что каждая строка из любого файла была бы считана как unicode, необходимо использовать эти 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
15
ответ дан DzinX 5 November 2019 в 13:16
поделиться

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

, При попытке преобразовать закодированный unicode в простой ASCII, Вы могли бы, возможно, сохранить отображение unicode пунктуации, которую требуется перевести в ASCII.

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

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

6
ответ дан Logan 5 November 2019 в 13:16
поделиться

Не принятие во внимание того, что Ваш текстовый файл повреждается (U+2018 является левой кавычкой, не апострофом): iconv может использоваться для транслитерации unicode символов к ASCII

, необходимо будет погуглить для "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                                     '.
3
ответ дан 5 November 2019 в 13:16
поделиться

Существует возможность, что так или иначе у Вас есть строка non-unicode с unicode символами ESC, например:

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

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

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this
2
ответ дан DzinX 5 November 2019 в 13:16
поделиться

На самом деле U+2018 является представлением Unicode специального символа †˜. Если Вы хотите, можно преобразовать экземпляры того символа к U+0027 с этим кодом:

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

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

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

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

'I don\u2018t like this'
1
ответ дан John Millikin 5 November 2019 в 13:16
поделиться

Это - Python, которые путь действительно показывает Вам, unicode закодировал строки. Но я думаю, что необходимо быть в состоянии распечатать строку на экране или записать его в новый файл без любых проблем.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this
1
ответ дан xardias 5 November 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: