Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Прочитать кириллицу с rtf-файла Python 3

#python #python_3x #rtf


Столкнулся с проблемой на python3 - прочитать из файла текст на кириллице (rtf, txt
 фаил). Выводит в терминал непонятные значения типа u/2424 и тд. Перепробовал все,
не могу понять как перекодировать его чтобы выводил нормально. И как прочитать из файла
одно слово? Спасибо за ответ!
Так же открывал таким методом. Вывод не меняется!

open('...', 'r', encoding='utf-8')

file = open('some_text.rtf', 'r')
print(file.readlines())


Вот такой вывод кирилицы:

['\xd0\x92\xd0\xb0\xd1\x88 \xd1\x88\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xb2\xd1\x80 \xd0\xb3\xd0\xbe\xd1\x82\xd0\xbe\xd0\xb2!\n',
'\xd0\xa1 \xd0\xb4\xd1\x80\xd1\x83\xd0\xb3\xd0\xbe\xd0\xb9

    


Ответы

Ответ 1



RTF - не plain-text файл и просто так из него ничего прочитать не выйдет. В нем дополнительно хранятся таблицы шрифтов, цветов, стилей и еще неведомо чего. Более того, судя по всему текст там хранится не в виде байтов u/1234, а в виде строк 'u/1234' (!) (или для другой подходящей кодировки, например, win-1251 - в этом случае кирилица представлена строками типа \'b2, \'a4). Благо, есть парочка старых библиотек. Вот пример для pyth (для простого файла с одной строкой сработало): from pyth.plugins.rtf15.reader import Rtf15Reader doc = Rtf15Reader.read(open("doc.rtf", "r")) for paragraph in doc.content: for word in paragraph.content: print(word.__dict__["content"]) # Вывод в виде unicode строки С документацией плоховато и неизвестно как именно библиотека справляется с таблицами, изображениями.

Ответ 2



Если на машине уже стоит LibreOffice, то можно на него опереться, чтобы поддерживать даже астральные символы такие как смайлики, флаги итд. pyth и большинство других rtf-библиотек могут потерять символы из rtf-документа с символами, требующих utf-16 суррогатных пар, пример test.rtf: {\rtf1\ansi\ansicpg1251\uc0 test [\'ff] [\u9786] [\u-10187\u-9138] [\u-10180\u-8710\u-10180\u-8712].} Команда $ rtf2txt test.rtf сохраняет текст в test.txt и печатает его: test [я] [☺] [𝑎] [🇺🇸]. где rtf2txt: #!/usr/bin/env python3 """Convert rtf-file(s) to plain text using LibreOffice. Usage: rtf2txt ... """ from getpass import getuser from pathlib import Path from subprocess import DEVNULL, check_call from sys import argv from tempfile import TemporaryDirectory filenames = argv[1:] with TemporaryDirectory('LibreOffice_Conversion_' + getuser()) as td: check_call([ 'soffice', '--headless', # implied by convert-to # https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options '--infilter="Rich Text Format (StarCalc)"', # limit input formats # specify the encoding explicitly for the output '--convert-to', 'txt:Text (encoded):UTF8', # https://bugs.documentfoundation.org/show_bug.cgi?id=37531 '-env:UserInstallation=' + Path(td).as_uri() ] + filenames, stdout=DEVNULL) for path in map(Path, filenames): print(path.with_suffix('.txt').read_text('utf-8'))

Комментариев нет:

Отправить комментарий