У меня есть сценарий python, который отлично работает на моей локальной машине (OS X), но когда я скопировал его на сервер (Debian), он не работает должным образом. Сценарий читает xml-файл и печатает содержимое в новом формате. На моей локальной машине я могу запустить скрипт с помощью stdout на терминал или в файл (т. Е. > myFile.txt
), и оба работают нормально.UnicodeEncodeError при записи в файл
Однако, на сервере (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
в оболочке (как предложено в некоторых сообщениях 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()
Просьба указать код, который вы используете –
@AlastairMcCormack Code добавлен. Что касается редактирования вашего вопроса, откуда вы знаете, что это проблема исключительно python, а не bash/io? Почему вывод python зависит от адресата вывода? – reynoldsnlp
Прохладный. Это происходит потому, что ошибка возникает, когда вы пишете файл, поэтому Bash не участвует (если вы не имеете в виду перенаправление). Тег ввода-вывода больше связан с физическим вводом-выводом –