Если на машине уже стоит 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 <rtf-file>...
"""
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'))
openесть параметрencoding, если его не указывать, кодировка берется системная. Укажите в нем кодировку файла. Например:open('...', 'r', encoding='utf-8')– gil9red Jun 02 '16 at 06:38также писал в начале файла #encoding utf-8 тоже не помогло
– Вадим Вова Jun 02 '16 at 06:39['Ваш шедевр готов!\n', 'С другой']. Если бы в вопросе была описана внятная последовательность действий, и не два вопроса в одном, то можно было бы что-то посоветовать. А так можно только гадать. – insolor Jun 03 '16 at 10:35