UnicodeEncodeError в python3 при использовании перенаправления - PullRequest
0 голосов
/ 17 января 2020

Что я хочу сделать: извлечь текстовую информацию из PDF-файла и перенаправить ее в текстовый файл.

Что я сделал:

pip install pdfminor

pdf2txt.py file.pdf > output.txt

Что я получил:

UnicodeEncodeError: код 'gbk' c не может закодировать символ '\ u2022' в позиции 0: недопустимая многобайтовая последовательность

Мое наблюдение:

\u2022 - точка маркера, .

pdf2txt.py хорошо работает без перенаправления: символ точки маркера записывается в стандартный вывод без ошибок.

Мой вопрос:

Почему перенаправление вызывает ошибку python? Насколько я знаю, перенаправление - это задание ОС, и оно просто копирует вещи после завершения программы.

Как я могу исправить эту ошибку? Я не могу внести никаких изменений в pdf2txt.py, так как это не мой код.

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Перенаправление вызывает ошибку, потому что кодировка по умолчанию, используемая Python, не поддерживает один из символов, которые вы пытаетесь вывести. В вашем случае вы пытаетесь вывести символ маркера , используя код GBK c. Это, вероятно, означает, что вы используете китайскую версию Windows.

Версия Python 3.6 или более поздняя будет нормально работать при выводе в окно терминала на Windows, поскольку кодирование символов полностью обходится с помощью Unicode. Только при перенаправлении вывода в файл Юникод должен быть закодирован в поток байтов.

Вы можете установить переменную окружения PYTHONIOENCODING, чтобы изменить кодировку, используемую для stdio. Если вы используете UTF-8, он гарантированно будет работать с любым символом Юникода.

set PYTHONIOENCODING=utf-8
pdf2txt.py file.pdf > output.txt
0 голосов
/ 17 января 2020

Вы, похоже, каким-то образом получили символы Юникода из необработанных байтов, но вам необходимо их кодировать. Я рекомендую вам использовать кодировку UTF-8 для текстовых файлов.

Вероятно, вам нужно сделать параметр кодировки более явным.

def gbk_to_utf8(source, target):
    with open(source, "r", encoding="gbk") as src: 
        with open(target, "w", encoding="utf-8") as dst: 
            for line in src.readlines():
                dst.write(line)
...