#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'))
Комментариев нет:
Отправить комментарий