gpt4 book ai didi

python - 写入文件时出现 UnicodeEncodeError

转载 作者:太空狗 更新时间:2023-10-29 12:29:04 28 4
gpt4 key购买 nike

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

但是,在服务器(ssh)上,当我打印到终端时一切正常,但是打印到文件(这是我真正需要的)会出现 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' )。

如果我$ export PYTHONIOENCODING=utf-8在 shell 中(如一些 SO 帖子中所建议的),然后我得到一个二进制文件:1 <D0><9A><D0><B0><D0><BC><D0><B0> .

我检查了所有 locale变量和相关变量与我在本地计算机上的变量相匹配。

我可以简单地在本地处理文件并上传,但我真的很想了解这里发生了什么。由于 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()

最佳答案

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

使用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

关于python - 写入文件时出现 UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32924147/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com