'ascii'编解码器无法在位置9编码字符'\ xc9':序数不在范围内(128)

时间:2019-02-19 13:32:55

标签: python-3.x docker encoding character-encoding python-3.6

我有一个文本是使用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),但没有任何改变!
如果有帮助,当我打印变量textprint(type(text)))的类型时,我得到<class 'str'>。 任何想法如何解决此错误?

编辑:

我正在处理的文件示例(不用担心机密性,该示例来自Internet)
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ÉPUBLIQUEFRANÇAI
RE
D'IDENTITÉNe:880692310285
法兰西民族博物馆
30 | Noms BERTHIER
Prénoms):CORINNE
…Néfelle:1985年12月6日
性爱
Sexe:L N
3:巴黎1ER(75)
ETES
泰拳:170
巡游她
|签名
Le pol
du titulaire:
IDFRABERTHIFR < 88069231028S8CORINNE <<<<<<< 6512068F6

EDIT3:
如果我从encoding='utf-8'中删除with open(filename, 'w') ..,我只会得到普通字符;包含特殊字符的每一行都不再写入文件。 python I / O编码为utf-8 语言环境-a的输出为C C.UTF-8 POSIX

1 个答案:

答案 0 :(得分:1)

@triplee所述,问题与locale编码有关:它设置为POSIX。因此,按照他的建议,想法是例如使用utf-8将语言环境设置为locale-gen fr_FR.UTF-8
而且由于我正在运行的项目是在Docker上,因此我必须将这些更改写入Dockerfile-dev。
幸运的是,我在Docker上发现了a similar question的同一问题。因此,这是我添加到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 builddocker-compose up