Кодек «ascii» не может кодировать символ «\ xc9» в позиции 9: порядковый номер не в диапазоне (128) - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть текст, который я извлек из изображения, используя Tesseract.Когда я пытаюсь распечатать его в терминале, я получаю эту ошибку 'ascii' codec can't encode character '\xc7' in position 10: ordinal not in range(128) в случае специальных символов (é, è, à, ç ...). Когда я записываю извлеченный текст в файл, я получаю правильный текст, включаяспециальные символы!
Вот код, который я использовал:

# -*- coding: utf-8 -*-
import cv2
import pytesseract
with open ('path_to_text_file', 'w', encoding='utf-8') as f:
    try:
        im = cv2.imread(path_to_image)
        text = pytesseract.image_to_string(im, lang='fra')
        f.write(text + '\n')
        print(text)
    except Exception as e:
        print(e)
f.close()

Я также попытался print(str(text)) вместо print(text), но ничего не изменилось!
В случае, если это полезно, когда я печатаютип переменной text (print(type(text))), я получаю <class 'str'>.Есть идеи, как исправить эту ошибку?

РЕДАКТИРОВАТЬ:

Пример файлов, с которыми я имею дело (Не беспокойтесь о конфиденциальности, этот пример из Интернета)
enter image description here

Я использую Ubuntu 18.04, python 3.6
Проект, который я запускаю, находится в Docker.

EDIT2:
Вывод, отображаемый в терминале:

'ascii' codec can't encode character '\xc9' in position 1: ordinal not in range(128)
'ascii' codec can't encode character '\xc9' in position 12: ordinal not in range(128)
'ascii' codec can't encode character '\xe9' in position 10: ordinal not in range(128)
30 | Noms BERTHIER
'ascii' codec can't encode character '\xe9' in position 2: ordinal not in range(128)
'ascii' codec can't encode character '\u2026' in position 0: ordinal not in range(128)
Sexe
Sexe: L N
3: PARIS 1ER (75)
ETES
Taie : 170
Cruise Her
| Signature
Le pol
du titulaire :
IDFRABERTHIFR<<EK<KEKKKELELEREREELEREE
88069231028S8CORINNE<<<<<<<6512068F6  

Вывод, записанный в текстовый файл:

RÉPUBLIQUE FRANÇAI
RE
D'IDENTITÉ Ne: 880692310285
Nationalité Francaise
30 |Noms BERTHIER
Prénoms): CORINNE
… Néfel le: 06.12.1985
Sexe
Sexe: LN
3: PARIS 1ER (75)
ETES
Taie: 170
Cruise Her
|Подпись
Le pol
du titulaire:
IDFRABERTHIFR <88069231028S8CORINNE <<<<<<< 6512068F6 </p>

EDIT3:
Если я удаляю encoding='utf-8' изwith open(filename, 'w') .. Я получаю только нормальные символы;каждая строка, в которой есть специальные символы, больше не записывается в файл.Кодировка ввода / вывода Python: UTF-8. Выходные данные локали -a: C C.UTF-8 POSIX

1 Ответ

0 голосов
/ 19 февраля 2019

Как было сказано @ triplee , проблема была в кодировке locale: для нее было установлено значение POSIX.Таким образом, идея, как он предложил, состояла в том, чтобы установить языковой стандарт на utf-8, используя, например, locale-gen fr_FR.UTF-8.
И поскольку проект, который я запускаю, находится на Docker, я должен записать эти изменения в Dockerfile-dev.
К счастью, я нашел похожий вопрос о той же проблеме в Docker.Итак, вот что я добавил в свой Dockerfile-dev, чтобы установить языковой стандарт utf-8:

RUN apt-get -qq update && \
    apt-get -q -y upgrade && \
    apt-get install -y sudo curl wget locales && \
    rm -rf /var/lib/apt/lists/*

# Ensure that we always use UTF-8 and with French locale
RUN locale-gen fr_FR.UTF-8


RUN chmod 0755 /etc/default/locale

ENV LC_ALL=fr_FR.UTF-8
ENV LANG=fr_FR.UTF-8
ENV LANGUAGE=fr_FR.UTF-8

После сохранения в Dockerfile-dev я запускаю docker-compose build и docker-compose up.

...