写入文件时的UnicodeEncodeError

我有一个python脚本,在我的本地机器(OS X)上效果很好,但是当我将它复制到服务器(Debian)时,它不能按预期工作。 该脚本读取一个xml文件并以新格式打印内容。 在我的本地机器上,我可以使用stdout将脚本运行到terminal或文件(即> myFile.txt ),两者都可以正常工作。

然而,在服务器上( ssh ),当我打印到terminal一切正常,但打印到文件(这是我真正需要)给UnicodeEncodeError: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 。 所有的文件都是utf-8编码,并且在魔术评论中声明了utf-8。

如果我在列表中打印str对象(这是我通常用来获取编码问题的一个技巧),它也会引发同样的错误。

如果使用print( x.encode('utf-8') ) ,那么它会打印代码样式的位(例如b'1' b'\xd0\x9a\xd0\xb0\xd0\xbc\xd0\xb0' ) 。

如果我在shell中$ export PYTHONIOENCODING=utf-8 (如某些SOpost中所build议的),那么我得到一个二进制文件: 1 <D0><9A><D0><B0><D0><BC><D0><B0>

我已经检查了所有的localevariables,并且相关的variables与我在本地机器上的variables相匹配。

我可以简单地在本地处理文件并上传,但我真的很想了解这里发生的事情。 由于Python代码在一台计算机上工作,我不确定它是相关的,但我在下面添加它:

 # -*- encoding: utf-8 -*- import sys, xml.etree.ElementTree as ET corpus = ET.parse('file.xml') text = corpus.getroot() for body in text : for sent in body : depDOMs = [(0,'') for i in range(len(sent)+1)] for word in sent : if word.tag == 'LF' : pass elif 'ID' in word.attrib and 'FEAT' in word.attrib and 'DOM' in word.attrib : ID = word.attrib['ID'] try : Form = word.text.replace(' ','_') except AttributeError : Form = '_' try : Lemma = word.attrib['LEMMA'].replace(' ', '_') except KeyError : Lemma = '*NULL*' CPOS = word.attrib['FEAT'].split()[0] POS = word.attrib['FEAT'].replace( ' ' , '_' ) Feats = '_' Head = word.attrib['DOM'] if Head == '_root' : Head = '0' try : DepRel = word.attrib['LINK'] except KeyError : DepRel = 'ROOT' PHead = '_' PDepRel = '_' try: if word.attrib['NODETYPE'] == 'FANTOM' : word.attrib['LEMMA'] = '*'+word.attrib['LEMMA']+'*' except KeyError : pass print( ID , Form , Lemma , Feats, CPOS , POS , Head , DepRel , PHead , PDepRel , sep='\t' ) else : print( 'WARNING: what is this?',sent.attrib['ID'],word.attrib) print() 

Solutions Collecting From Web of "写入文件时的UnicodeEncodeError"

潜在的问题可能是由于Linux的语言环境错误配置造成的,这意味着在打印非ASCII字符时Python太谨慎了。

使用locale确认语言环境配置。 如果出现问题,您会看到如下所示的内容:

 $ locale locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=en_US.UTF-8 LANGUAGE= 

解决这个问题:

 $ sudo locale-gen "en_US.UTF-8" 

(将“en_US.UTF-8”替换为不工作的语言环境)。 有关更多信息,请参阅: https : //askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue

您可以在基于UnicodeError的异常的属性中找到与您遇到的错误相关的重要信息。

引用文档:

UnicodeError具有描述编码或解码错误的属性。 例如, err.object[err.start:err.end]给出编解码器失败的特定无效输入。

编码

引发错误的编码的名称。

原因

描述特定编解码器错误的字符串。

目的

编解码器试图编码或解码的对象。

开始

对象中无效数据的第一个索引。

结束

对象中最后一个无效数据之后的索引。