Python에서 파일을 읽고 쓰는 Unicode(UTF-8)
파일을 읽고 쓰는 데 약간의 문제가 있습니다(Python 2.4).
# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)
('u' Capit\xe1n', 'Capit\xc3\xa1n')
print ss, ss8
print >> open('f1','w'), ss8
>>> file('f1').read()
'Capit\xc3\xa1n\n'
제가 을 합니다.Capit\xc3\xa1n
"f2" "f2"
그 후, 다음과 같이 입력합니다.
>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'
내가 이해하지 못하는 게 뭐야?확실히 내가 놓치고 있는 중요한 마법(또는 센스)이 있다.적절한 변환을 얻으려면 텍스트 파일에 무엇을 입력해야 합니까?
UTF-8이 외부에서 왔을 때 Python이 인식할 수 없는 것이 UTF-8의 요점입니다.JSON은 문자열을 덤프하고 대신 사용하는 것이 좋을지도 모릅니다.그것은 알기 쉬운 표현이기 때문입니다.더 중요한 것은 파일로부터 수신했을 때 파이썬이 인식하고 디코딩할 유니코드 오브젝트의 ASCII 표현이 있는가?그렇다면 어떻게 구하죠?
>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'
.encode
★★★★★★★★★★★★★★★★★」.decode
파일을 열 때 인코딩을 지정합니다.Python 2.6에 추가된 이 모듈은 다음과 같은 기능을 제공합니다.io.open
를 사용하면 이름을 할 수 .encoding
.
파일이 UTF-8로 인코딩되어 있는 경우는, 다음의 것을 사용할 수 있습니다.
>>> import io
>>> f = io.open("test", mode="r", encoding="utf-8")
★★★★★★★★★★★★★★★.f.read
유니코드
>>> f.read()
u'Capit\xe1l\n\n'
에서는 3.x의io.open
된 입니다.open
function function 、 function the 、 the function the the the the the the the를 입니다.encoding
(2.x)
표준 라이브러리 모듈에서도 사용할 수 있습니다.
>>> import codecs
>>> f = codecs.open("test", "r", "utf-8")
>>> f.read()
u'Capit\xe1l\n\n'
단, 이 경우 와 혼재 시 문제가 발생할 수 있습니다.
으로는 '''입니다.u'Capit\xe1n\n'
)'Capit\xe1n\n'
3.x 및 3.0 및 3.1에 있어야 합니다.)\xe1
1번으로 하다 \x
시퀀스입니다.은, 「스케이프 시퀀스」를 있습니다.e1
16번입니다.
★★Capit\xc3\xa1n
것은 포함된다는 합니다.\xc3\xa1
그것들은 8바이트이고 코드는 그것들을 모두 읽는다.결과를 표시함으로써 이를 확인할 수 있습니다.
# Python 3.x - reading the file as bytes rather than text,
# to ensure we see the raw data
>>> open('f2', 'rb').read()
b'Capit\\xc3\\xa1n\n'
# Python 2.x
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
'먹다'는 ''와 같은 글자만 .á
UTF-8을 사용하다
2 백슬래시 시퀀스를 을 2.x, " " " 를 수 .string_escape
디세이블로그:
# Python 2.x
>>> print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
Capitán
결과, 「」가 됩니다.str
문자는 로 표시됩니다.\\xc3\\xa1
원래 문자열로.「 」를 unicode
로 .
3.x, 3.x 는string_escape
codec is replaced with 코덱은 로 대체됩니다.unicode_escape
, , and it is strictly enforced that we can only , 그리고 우리가 할 수 있는 것은 오직encode
에에서str
to 로.bytes
, , and ,그리고.decode
부에서bytes
to 로.str
unicode_escape
는 「」로 할 필요가 있습니다.bytes
이스케이프 시퀀스를 처리하기 위해서(반대로, 그것들을 추가한다), 그리고 나서 결과물을 처리한다.\xc3
★★★★★★★★★★★★★★★★★」\xa1
바이트 이스케이프보다 문자가 이스케이프됩니다.그 결과, 우리는 조금 더 많은 작업을 해야 합니다.
# Python 3.x
>>> 'Capit\\xc3\\xa1n\n'.encode('ascii').decode('unicode_escape').encode('latin-1').decode('utf-8')
'Capitán\n'
은 Python3뿐입니다.open(Filename, 'r', encoding='utf-8')
[2016-02-10에 편집하여 해명 요청]
Python3는 열린 함수에 인코딩 매개 변수를 추가했습니다.open 함수에 대한 다음 정보는 https://docs.python.org/3/library/functions.html#open 에서 얻을 수 있습니다.
open(file, mode='r', buffering=-1,
encoding=None, errors=None, newline=None,
closefd=True, opener=None)
인코딩은 파일을 디코딩 또는 인코딩하는 데 사용되는 인코딩 이름입니다.이것은 텍스트 모드에서만 사용해야 합니다.기본 인코딩은 플랫폼에 의존하지만(local.getpreferredencoding()이 반환하는 경우) Python에서 지원되는 텍스트 인코딩은 Python에서 지원됩니다.지원되는 인코딩 목록은 코덱모듈을 참조하십시오.
래 so so so so so so를 encoding='utf-8'
함수의 및 utf8에서 실행되는 로 이루어집니다.open은 utf8을 사용하여 utf8을 실행한다.
그래서 제가 찾고 있는 것에 대한 해결책을 찾았습니다. 바로 다음과 같습니다.
print open('f2').read().decode('string-escape').decode("utf-8")
여기에 도움이 되는 특이한 코덱이 몇 가지 있습니다.이 특정 읽기를 통해 Python 내에서 UTF-8 표현을 가져와 ASCII 파일로 복사하고 Unicode로 읽을 수 있습니다.스트링 이스케이프 디코딩에서는 슬래시가 두 배로 늘어나지 않습니다.
이것은 내가 상상했던 종류의 왕복 여행을 가능하게 한다.
이것은 Python 3.2에서 UTF-8 인코딩을 사용하는 파일을 읽을 때 작동합니다.
import codecs
f = codecs.open('file_name.txt', 'r', 'UTF-8')
for line in f:
print(line)
# -*- encoding: utf-8 -*-
# converting a unknown formatting file in utf-8
import codecs
import commands
file_location = "jumper.sub"
file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location)
file_stream = codecs.open(file_location, 'r', file_encoding)
file_output = codecs.open(file_location+"b", 'w', 'utf-8')
for l in file_stream:
file_output.write(l)
file_stream.close()
file_output.close()
★★★★★외codecs.open()
,io.open()
는 2.x 와 3.x 에서 모두 텍스트파일을 읽고 쓸 수 있습니다.§:
import io
text = u'á'
encoding = 'utf8'
with io.open('data.txt', 'w', encoding=encoding, newline='\n') as fout:
fout.write(text)
with io.open('data.txt', 'r', encoding=encoding, newline='\n') as fin:
text2 = fin.read()
assert text == text2
유니코드 문자열을 읽고 HTML로 전송하려면 다음을 수행합니다.
fileline.decode("utf-8").encode('ascii', 'xmlcharrefreplace')
python으로 구동되는http 서버에 편리합니다.
에서는 이 텍스트 에디터가 이 텍스트 에디터를 \xc3\xa1
그래서백슬래시 + 진짜 입니다.이제 진짜 백슬래시 +가 됩니다.xc3
, 등입니다.
Python에서 인코딩된 파일을 읽고 쓰려면 코덱 모듈을 사용하는 것이 좋습니다.
어떤 프로그램이 어떤 인코딩을 사용하여 텍스트를 해석할지 모르기 때문에 단말기와 응용 프로그램 간에 텍스트를 붙여넣는 것은 어렵습니다.다음을 시도할 수 있습니다.
>>> s = file("f1").read()
>>> print unicode(s, "Latin-1")
Capitán
그런 다음 이 문자열을 편집기에 붙여넣고 Latin-1을 사용하여 저장하는지 확인합니다.클립보드로 문자열이 깨지지 않는다고 가정하면 라운드 트립이 동작합니다.
인코딩에 관한 일반적인 문제를 해결했습니다.파일이 어떤 인코딩인지 어떻게 알 수 있습니까?
답변: 파일 형식이 이를 제공하지 않는 한 사용할 수 없습니다.예를 들어 XML은 다음과 같이 시작합니다.
<?xml encoding="utf-8"?>
이 헤더는 부호화에 관계없이 읽을 수 있도록 신중하게 선택되었습니다.당신의 경우, 그러한 힌트가 없기 때문에 당신의 에디터나 Python 모두 무슨 일이 일어나고 있는지 모릅니다.따라서 다음 명령어를 사용해야 합니다.codecs
을 하여 " " 를 사용합니다.codecs.open(path,mode,encoding)
파이썬
에디터에 대해서는, 파일의 인코딩을 설정할 수 있는 방법이 있는지를 확인할 필요가 있습니다.
UTF-8의 포인트는 21비트 문자(Unicode)를 8비트 데이터 스트림으로 인코딩할 수 있는 것입니다(세계의 모든 컴퓨터가 처리할 수 있는 것은 이것뿐이기 때문입니다).그러나 대부분의 OS는 Unicode 시대 이전이기 때문에 인코딩 정보를 하드 디스크 파일에 첨부할 수 있는 적절한 도구를 가지고 있지 않습니다.
다음 문제는 Python에서의 표현입니다.이것은 Heikogerlach의 댓글에 완벽하게 설명되어 있다.콘솔이 표시할 수 있는 것은 ASCII뿐임을 이해해 둘 필요가 있습니다.Unicode 또는 >= 문자 코드 128을 표시하려면 이스케이프 방법을 사용해야 합니다.편집기에서 이스케이프된 표시 문자열이 아니라 문자열의 의미를 입력해야 합니다(이 경우 umlaut를 입력하고 파일을 저장해야 합니다).
즉, Python 함수 eval()을 사용하여 이스케이프된 문자열을 문자열로 변환할 수 있습니다.
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
보시는 바와 같이 문자열 "\xc3"이 단일 문자로 변환되었습니다.이것은 UTF-8로 인코딩된8비트 문자열입니다Unicode를 가져오려면:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
그레그 린드가 물었다.f2 파일에는 다음과 같은 16진수가 포함되어 있지 않은 부분이 있습니다.
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
예를 들어, 는 그것들을 모두 다른 문자(예상)로 읽습니다.ASCII ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii ascii?
답변: 그것은 당신이 무엇을 의미하느냐에 달려있다.ASCII는 127 문자보다 큰 문자를 나타낼 수 없습니다.따라서 "다음 몇 글자는 특별한 의미가 있습니다"라고 말할 수 있는 방법이 필요합니다.이것이 시퀀스 "\x"의 동작입니다.다음과 같이 되어 있습니다.다음 두 문자는 단일 문자의 코드입니다."\u"는 4글자를 사용하여 Unicode를 0xFFFF(65535)까지 인코딩합니다.
따라서 유니코드를 ASCII에 직접 쓸 수 없습니다(ASCII에 같은 문자가 포함되어 있지 않기 때문입니다).문자열 이스케이프(f2와 같이)로 쓸 수 있습니다.이 경우 파일은 ASCII로 나타낼 수 있습니다.또는 UTF-8로 쓸 수도 있습니다.이 경우 8비트의 세이프 스트림이 필요합니다.
★★★★★★★★를 decode('string-escape')
에 주의해 사용량은 다음과 같습니다. (3배)codecs.open()
.
파일은 8비트의 바이트 시퀀스일 뿐입니다.비트도 바이트도 의미가 없습니다.는 '를 뜻합니다 65는 'A'를 뜻합니다 65는 'A'를 뜻합니다.★★\xc3\xa1
이 되어야 수 있는 쓸 때 사용한 합니다.
\x...Sequence는 Python에 고유한 것입니다.범용 바이트 이스케이프 시퀀스가 아닙니다.
실제로 UTF-8로 인코딩된 비ASCII로 입력하는 방법은 OS 및/또는 에디터에 따라 달라집니다.Windows 에서의 조작 방법은 다음과 같습니다.OS X가 a를 급성 악센트로 입력하려면 + 를 누른 다음 을 누르면 됩니다. OS X의 거의 모든 텍스트 에디터는 UTF-8을 지원합니다.
, 원래의 것을 도 있습니다.open()
할 수 .partial
오래된 코드를 가 없다는 입니다.이 솔루션의 장점은 오래된 코드를 변경할 필요가 없다는 것입니다.투명해요.
import codecs
import functools
open = functools.partial(codecs.open, encoding='utf-8')
Python 2.7.9를 사용하여 iCal을 해석하려고 했습니다.
Calendar
하지만 난 알아채고 있었어
Traceback (most recent call last):
File "ical.py", line 92, in parse
print "{}".format(e[attr])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 7: ordinal not in range(128)
그리고 그것은 단지 다음과 같이 해결되었다.
print "{}".format(e[attr].encode("utf-8"))
(이제 liké a böss를 인쇄할 수 있게 되었습니다.)
스크립트 전체의 기본 인코딩을 'UTF-8'로 변경하여 가장 간단한 방법을 찾았습니다.
import sys
reload(sys)
sys.setdefaultencoding('utf8')
open
,print
않으면 '아니다'를 사용합니다.utf8
.
적어도 다음 기간 동안 동작합니다.Python 2.7.9
.
x 는, https://markhneedham.com/blog/2015/05/21/python-unicodeencodeerror-ascii-codec-cant-encode-character-uxfc-in-position-11-ordinal-not-in-range128/ 에 액세스 합니다(마지막을 참조).
언급URL : https://stackoverflow.com/questions/491921/unicode-utf-8-reading-and-writing-to-files-in-python
'programing' 카테고리의 다른 글
앰퍼샌드를 사용하여 PHP 함수를 시작하는 것은 무엇을 의미합니까? (0) | 2022.12.31 |
---|---|
Pythons 타임릿을 사용하여 성능을 테스트하기 위한 코드 세그먼트를 어떻게 시간을 잴 수 있습니까? (0) | 2022.12.31 |
왼쪽 조인(왼쪽 조인) (0) | 2022.12.31 |
MySQL에서 파라미터를 사용하여 뷰를 작성할 수 있습니까? (0) | 2022.12.31 |
최대 절전 모드에서 열거형을 문자열에 매핑하는 중 (0) | 2022.12.31 |