내 로컬 컴퓨터 (OS X)에서 잘 작동하는 python 스크립트가 있지만 서버 (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
쉘에 있으면 (일부 SO 게시물에서 제안한대로) 바이너리 파일을 얻습니다 1 <D0><9A><D0><B0><D0><BC><D0><B0>
..
모든 locale
변수를 확인 했으며 관련 변수가 로컬 컴퓨터에있는 것과 일치합니다.
파일을 로컬에서 간단히 처리하고 업로드 할 수 있지만 여기서 무슨 일이 일어나고 있는지 정말 이해하고 싶습니다. 파이썬 코드가 한 컴퓨터에서 작동하기 때문에 관련성이 있는지 확실하지 않지만 아래에 추가합니다.
# -*- 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의 로케일 구성이 잘못되어 발생할 수 있습니다. 즉, 비 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를 참조하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다