Найти - Пользователи
Полная версия: парсинг выхода mystem
Начало » Python для новичков » парсинг выхода mystem
1
mrgloom
есть 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]
выдает в каком то другом формате.
+еще непонятно, как считывать до разделителя | каждое слово отдельно в строке?
mrgloom
причем

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
dimy44
считывать чтоб до разделителя есть
split('|')
а у вас там видимо кодировка не cp866, а другая, раз крякозябры пишет, и к str нужно не encode, а *.decode('какая там кодировка') применять, а затем уже если надо *.encode('куда угодно')
bw
`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
mrgloom
файл 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
mrgloom
причем если в notepad++ сделать convert to UTF-8 (текст виден нормально), а потом encoding in ANSI (текст виден в неправильной кодировке) и попытаться его вывести
print line.decode('utf-8')
то всё выводит правильно в консоли
mrgloom
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()
dimy44
Такого рода вопросы вынуждают участников форума делать выводы на основе предположений, тогда как имея исходные данные данная проблема даже методом тыка за 10 минут решается на месте.
mrgloom
да дело то понятно что было в кодировке, только явно указывать кодировку это какое то не гибкое решение и вообще есть предположение что это причуды винды, что в файле и в консоли разные кодировки.
и в notepad++ явно не было указано cp1251, а было ANSI.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB