Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2013 15:38:20

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг выхода mystem

есть mystem
запускаю его

mystem -n -w -l doc.txt out.txt
получаю построчный файл, что то типа
вымышлять
тем|тема|то|тот
не
мало|менее|меней
потом читаю построчно на питоне
ins = open( "out.txt", "r" )
words = []
for line in ins:
    words.append( line )
ins.close()
print len(words)
но вопервых не могу вывести в консоль слова аля
words[11]
выдает в каком то другом формате.
+еще непонятно, как считывать до разделителя | каждое слово отдельно в строке?



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Ноя. 12, 2013 15:56:33)

Офлайн

#2 Ноя. 12, 2013 15:55:29

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг выхода mystem

причем

import sys
print sys.stdout.encoding  # выдает cp866

но когда я пытаюсь
ins = open( "out.txt", "r" )
words = []
s=0
for line in ins:
	if (s<10):
		print line.encode('cp866') #what encoding?
		s=s+1
	words.append( line )
ins.close()
print len(words)
то выдает ошибку can't decode byte 0xf4



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Ноя. 12, 2013 15:55:44)

Офлайн

#3 Ноя. 12, 2013 16:49:25

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

парсинг выхода mystem

считывать чтоб до разделителя есть

split('|')
а у вас там видимо кодировка не cp866, а другая, раз крякозябры пишет, и к str нужно не encode, а *.decode('какая там кодировка') применять, а затем уже если надо *.encode('куда угодно')

Отредактировано dimy44 (Ноя. 12, 2013 16:51:31)

Офлайн

#4 Ноя. 13, 2013 01:51:52

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

парсинг выхода mystem

`line.encode('cp866')` – ну сама `line` же при этом `str`? Т.е. она уже закодирована в какую-то неизвестную кодировку (что там mystem рожает). Если пытаться кодировать `str`, то она сначала будет декодирована как “ascii”, а затем закодирована указанной кодировкой.

Судя по всему исходный файл не “cp866” иначе бы не возникло проблемы в первом посту. dimy44 уже написал что нужно сделать (попробуйте не кодировать `unicode` для `print`а, кажется уже нет проблемы у Python с определением кодировки терминала, сам всё сделает, если нет, то придётся помогать), добавлю только, что если нет надёжных источников о том, какая же исходная кодировка, можно попробовать магию в лице пакета `chardet`.

p.s. Вместо "ins = open(…) ins.close()“, можно делать ”with open(…) as ins: ".

..bw



Офлайн

#5 Ноя. 13, 2013 09:14:25

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг выхода mystem

файл out.txt я посмотрел через notepad++ у него стоит кодировка ANSI
а

import sys
print sys.stdout.encoding 
выдает cp866

в notepad++ сделал конверт в UTF-8
т.е. я должен сделать
print line.decode('utf-8').encode('cp866')
но получаю ошибку на decode('utf-8') UnicodeEncodeError



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Ноя. 13, 2013 09:18:16)

Офлайн

#6 Ноя. 13, 2013 09:25:55

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг выхода mystem

причем если в notepad++ сделать convert to UTF-8 (текст виден нормально), а потом encoding in ANSI (текст виден в неправильной кодировке) и попытаться его вывести

print line.decode('utf-8')
то всё выводит правильно в консоли



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

#7 Ноя. 13, 2013 09:38:27

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг выхода mystem

with codecs.open('out.txt',encoding='cp1251')
вообщем так работает

или так

ins = open( "out.txt", "r")
words = []
s=0
for line in ins:
	if (s<10):
		print line.decode('cp1251')
		s=s+1
	words.append( line )
ins.close()



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

#8 Ноя. 13, 2013 11:01:45

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

парсинг выхода mystem

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

Офлайн

#9 Ноя. 13, 2013 13:05:48

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг выхода mystem

да дело то понятно что было в кодировке, только явно указывать кодировку это какое то не гибкое решение и вообще есть предположение что это причуды винды, что в файле и в консоли разные кодировки.
и в notepad++ явно не было указано cp1251, а было ANSI.



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version