我有一个文本是使用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'>
。
任何想法如何解决此错误?
编辑:
我正在处理的文件示例(不用担心机密性,该示例来自Internet)
我使用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
答案 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 build
和docker-compose up
。