Python에서 open과 codecs.open의 차이
Python에서 텍스트 파일을 여는 두 가지 방법이 있습니다.
f = open(filename)
그리고.
import codecs
f = codecs.open(filename, encoding="utf-8")
언제가codecs.open
보다 선호되는open
?
Python 2.6 이후로 좋은 방법을 사용하는 것입니다.io.open()
, 그것 또한 필요합니다.encoding
지금은 쓸모없는 논쟁처럼codecs.open()
. 파이썬 3에서는.io.open
에 대한 별칭입니다.open()
붙박이로. 그래서.io.open()
는 파이썬 2.6 및 파이썬 3.4를 포함한 모든 이후 버전에서 작동합니다.문서 참조: http://docs.python.org/3.4/library/io.html
이제, 원래 질문을 위해: 파이썬 2에서 텍스트("평판 텍스트", HTML, XML 및 JSON 포함)를 읽을 때 항상 사용해야 합니다.io.open()
명시적인 인코딩으로, 또는open()
Python 3에서 명시적인 인코딩을 사용합니다.이렇게 하면 정확하게 유니코드를 해독하거나 바로 오류가 발생하여 디버깅이 훨씬 쉬워집니다.
순수한 ASCII "평범한 텍스트"는 먼 과거로부터의 신화입니다.적절한 영어 텍스트는 따옴표, em-dash, bullets, €(유로 기호), 심지어 diaresis(직렬)를 사용합니다.순진하지 마! (그리고 파사드 디자인 패턴 잊지 마!)
순수 ASCII는 실제 옵션이 아니기 때문에,open()
명시적인 인코딩 없이 이진 파일을 읽을 때만 유용합니다.
저는 개인적으로 항상.codecs.open
사용할 필요성이 명백하게 확인되지 않는 한open
**. 그 이유는 utf-8 입력이 프로그램에 몰래 들어오는 것에 물린 적이 너무 많았기 때문입니다."오, 나는 그것이 항상 아스키일 것이라는 것을 알고 있습니다."는 종종 깨지는 가정입니다.
ASCII는 UTF-8로 취급될 수 있기 때문에 'utf-8'을 기본 인코딩으로 가정하는 것이 제 경험상 더 안전한 기본 선택인 경향이 있지만, 그 반대는 사실이 아닙니다.그리고 그런 경우에 입력이 ASCII인 것을 진정으로 알고 있다면, 여전히 알고 있습니다.codecs.open
저는 "묵시적인 것보다 명시적인 것이 낫다"는 확고한 신념을 가지고 있기 때문입니다.
** - Python 2.x에서, 질문에 대한 코멘트가 Python 3에 나와 있듯이.open
갈음하다codecs.open
파이썬 2에는 유니코드 문자열과 바이테스트 문자열이 있습니다.테스트 문자열만 사용하면 파일을 읽고 쓸 수 있습니다.open()
잘 돼가고 있습니다.결국, 문자열은 바이트에 불과합니다.
문제는 유니코드 문자열이 있고 다음과 같은 작업을 수행하는 경우에 발생합니다.
>>> example = u'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
그래서 분명히 여기서 utf-8에서 유니코드 문자열을 명시적으로 인코딩하거나codecs.open
당신을 위해 투명하게 할 겁니다
바이테스트스트링만 사용하는 경우에는 문제가 없습니다.
>>> example = 'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
>>>
할 때 를 할 을 보다 하기 입니다 으로써 와 하기 입니다 를 할 +
연산자는 유니코드 문자열을 받습니다.저 사람한테 물리기 쉽습니다.
.codecs.open
ASC가 아닌 bytestring을 좋아하지 않음전달되는 II 문자:
codecs.open('test', 'w', encoding='utf-8').write('Μου αρέσει')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/codecs.py", line 691, in write
return self.writer.write(data)
File "/usr/lib/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
입력/출력을 위한 문자열에 대한 조언은 일반적으로 "가능한 한 빨리 유니코드로 변환하고, 가능한 한 늦게 다시 바이트 문자열로 변환"하는 것입니다.용을 해서.codecs.open
후자를 아주 쉽게 할 수 있게 해줍니다.
ASC가 아닌 문자열로 유니코드 문자열을 지정하지 않도록 주의하십시오.2자.
codecs.open
, , , , , , , , , 의 잔재일 뿐이라고 합니다.Python 2
내장된 오픈이 훨씬 더 단순한 인터페이스와 더 적은 기능을 갖던 시절.Python 2의 경우 내장open
인코딩 인수를 사용하지 않으므로 이진 모드나 기본 인코딩이 아닌 다른 것을 사용하려면 codecs.open이 사용되어야 했습니다.
Python 2.6
, io 모듈은 일을 좀 더 간단하게 만들기 위해 도움을 주기 위해 왔습니다.공식 문서에 의하면
New in version 2.6.
The io module provides the Python interfaces to stream handling.
Under Python 2.x, this is proposed as an alternative to the
built-in file object, but in Python 3.x it is the default
interface to access files and streams.
그럼에도 불구하고, 내가 생각할 수 있는 유일한 용도는codecs.open
현재 시나리오는 하위 호환성을 위한 것입니다. < 2하지 않는 한른는든 (Python < 2.6지는한다이를는을다이는y를noers()는(든른ssrlt한는지<2nio.open
. Python 3.x
io.open
.built-in open
참고:
과 가 가 에는 통사적 가 있습니다.codecs.open
그리고.io.open
뿐만 아니라.
codecs.open
:
open(filename, mode='rb', encoding=None, errors='strict', buffering=1)
io.open
:
open(file, mode='r', buffering=-1, encoding=None,
errors=None, newline=None, closefd=True, opener=None)
인코딩이 할 는 이 을 는 는 codecs
모듈.
파일을 하려면 을 하려면 을 합니다 합니다 을 하려면 를 사용합니다.
f = io.open(filename, 'b')
.텍스트 파일을 열려면 항상 다음을 사용합니다.
f = io.open(filename, encoding='utf-8')
명시적인 부호화로
그러나 파이썬 3에서는open
와 같은 일을 합니다.io.open
대신 사용할 수 있습니다.
문서:
codecs.open
python 2.6에 도입된 이후에 더 이상 사용되지 않고 대체될 계획입니다.코드가 이전 파이썬 버전과 호환되어야 할 경우에만 사용하겠습니다.python의 코덱과 유니코드에 대한 자세한 내용은 유니코드 HOWTO를 참조하십시오.
텍스트 파일로 작업할 때 유니코드 개체로 투명하게 인코딩 및 디코딩할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5250744/difference-between-open-and-codecs-open-in-python
'IT' 카테고리의 다른 글
.Net에 URL validator가 있습니까? (0) | 2023.09.15 |
---|---|
mysql java 프로그램에서 works를 선택, 삽입 및 삭제하지만 업데이트가 작동하지 않습니다. (0) | 2023.09.15 |
Oracle에서 각 그룹의 최대값을 얻는 방법은 무엇입니까? (0) | 2023.09.15 |
ADO.NET을 사용하여 오라클 패키지 내 프로시저의 저장 프로시저 메타데이터 가져오기 (0) | 2023.09.15 |
urlib2HTTP 오류: HTTP 오류 403: 금지됨 (0) | 2023.09.15 |