Почему я не вижу ивритские символы при печати текста из файла utf-8 в Python? - PullRequest
2 голосов
/ 21 июля 2011

Я пытаюсь прочитать иврит из текстового файла:

def task1():
    f = open('C:\\Users\\royi\\Desktop\\final project\\corpus-haaretz.txt', 'r',"utf-8")
    print 'success'
    return f

a = task1()

Когда я читаю это, это показывает мне это:

'[\xee\xe0\xee\xf8 \xee\xf2\xf8\xeb\xfa \xf9\xec \xe4\xf0\xe9\xe5-\xe9\xe5\xf8\xf7 \xe8\xe9\xe9\xee\xf1: \xf2\xec \xe1\xe9\xfa \xe4\xee\xf9\xf4\xe8 \xec\xe1\xe8\xec \xe0\xfa \xe7\xe5\xf7 \xe4\xe7\xf8\xed, \xec\xe8\xe5\xe1\xfa \xe9\xf9\xf8\xe0\xec \xee\xe0\xfa \xf0\xe9\xe5 

и многие другие.

как мне это прочитать?

Ответы [ 4 ]

5 голосов
/ 21 июля 2011

Вы печатаете это так:

print task1().encode('your terminal encoding here')

Вы должны быть уверены, что ваш терминал может отображать ивритские символы. Например, под полным дистрибутивом utf-8 Linux с установленными языками иврита:

print task1().encode('utf-8')

Осторожно с open:

  • в python 2.7 у вас нет параметра кодирования. Используйте модуль codecs.
  • в python 3+ параметр кодирования - четвертый, а не третий, как вы. Вы можете иметь в виду что-то вроде open(path, 'r', encoding='utf-8'). Вы даже можете опустить 'r'.

Так зачем вам использовать encode?

Что ж, когда вы читаете файл и сообщаете Python кодировку, он возвращает объект Unicode, а не строковый объект. Например в моей системе:

>>> import codecs
>>> content = codecs.open('/etc/fstab', encoding='utf-8').read()
>>> type(content)
<type 'unicode'>
>>> type('')
<type 'str'>
>>> type(u'')
<type 'unicode'>

Вам нужно закодировать его обратно в строку, если вы хотите сделать ее печатной строкой, если она содержит символы не ascii:

>>> type(content.encode('utf-8'))
<type 'str'>

Мы используем encode, потому что здесь мы говорим о более или менее универсальном текстовом объекте (юникод настолько универсален, насколько вы можете получить с помощью текстовых манипуляций), и вы превращаете его (кодируете) в определенное представление (utf-8) .

И нам нужно это специальное представление, потому что ваша система не знает о внутреннем Python и может печатать только символы ascii, если вы не указали кодировку. Таким образом, когда вы выводите код, вы кодируете его специально для того, чтобы ваша система могла понять. Для меня это удачно 'utf-8', так что это легко. Если вы работаете в Windows, это может быть сложно.

1 голос
/ 21 июля 2011

Мне кажется, что кодировка получаемой строки - 'windows-1255', а не 'utf-8'.Попробуйте вместо этого открыть файл, используя эту кодировку.

1 голос
/ 21 июля 2011

Вам нужно использовать модуль codecs , чтобы открыть файл. Вызов open() (см. docs ) не принимает третий аргумент, подобный этому, третий аргумент будет bufsize.

В частности codecs.open(). Всегда декодировать, когда вы читаете, кодировать, когда вы выводите: -)

0 голосов
/ 21 июля 2011

Ваше описание того, как вы читаете файл, кажется неверным. Удивительно, что «это» удается показать вам байты, которые, очевидно, представляют собой текст на иврите, закодированный в cp1255.

Нам нужно однозначно показать , что находится в первых нескольких (скажем, 200) байтах вашего файла. Пожалуйста, запустите одну из следующих команд в окне командной строки, в зависимости от того, какой Python вы используете:

Python 2.x (при условии, что 2.7 установлено в стандартном месте):

prompt>c:\python27\python -c "import locale; print locale.getpreferredencoding(), repr(open('your_file.txt', 'rb').read(200))"

или Python 3.x

prompt>c:\python32\python -c "import locale; print(locale.getpreferredencoding(),ascii(open('your_file.txt', 'rb').read(200)))"

Отредактируйте ваш вопрос и (1) скопируйте / вставьте вывод команды (2), сообщите нам, какую версию Python вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...