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()
. Python 3에서는 내장 io.open
의 별칭입니다 open()
. 따라서 io.open()
Python 2.6 및 Python 3.4를 포함한 모든 이후 버전에서 작동합니다. 문서 참조 : http://docs.python.org/3.4/library/io.html
이제 원래의 질문에 대한 : 읽을 때 텍스트를 당신이해야 파이썬 2 (HTML, XML 및 JSON "일반 텍스트"를 포함하여) 항상 사용 io.open()
명시 적으로 인코딩을하거나, open()
파이썬 3에 명시 적으로 인코딩을 이렇게 수단을 제대로 얻을 유니 코드를 디코딩하거나 즉시 오류가 발생하여 디버깅이 훨씬 쉬워집니다.
순수한 ASCII "일반 텍스트"는 먼 과거의 신화입니다. 적절한 영어 텍스트는 둥근 따옴표, em- 대시, 글 머리 기호, € (유로 기호) 및 분음 기호 (¨)를 사용합니다. 순진하지 마십시오! (그리고 Façade 디자인 패턴을 잊지 말자!)
순수 ASCII는 실제 옵션이 아니기 때문에 open()
명시 적 인코딩 없이는 바이너리 파일 을 읽는 데만 유용 합니다.
개인적으로 저는 ** 를 사용해야하는 명확한 필요성이 확인되지 않는 한 항상 사용 합니다. 그 이유는 utf-8 입력이 내 프로그램에 몰래 들어가서 물린 적이 너무 많았 기 때문입니다. "오, 난 항상 아스키 일 거라는 걸 알아"는 가정이 자주 깨지는 경향이 있습니다.codecs.open
open
'utf-8'을 기본 인코딩으로 가정하면 ASCII가 UTF-8로 처리 될 수 있기 때문에 내 경험상 더 안전한 기본 선택이되는 경향이 있지만 그 반대는 사실이 아닙니다. 그리고 입력이 ASCII 라는 것을 진정으로 알고 있는 경우 에도 "명시적인 것이 암시적인 것보다 낫다"를codecs.open
확고하게 믿기 때문에 여전히 그렇게 합니다.
**-Python 2.x에서는 Python 3의 질문 상태에 대한 주석 open
이codecs.open
Python 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
비 ASCII 문자가 전달되는 바이트 문자열을 좋아하지 않습니다.
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
하면 후자를 매우 쉽게 할 수 있습니다.
ASCII가 아닌 문자를 포함 할 수있는 바이트 문자열이 아닌 유니 코드 문자열을 제공하고 있다는 점에주의하십시오.
특정 인코딩이있는 파일을 열려면 codecs
모듈을 사용합니다 .
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
하지만 현재 시나리오에서 내가 생각할 수있는 유일한 용도 는 이전 버전과의 호환성입니다. 다른 모든 시나리오에서는 (Python <2.6을 사용하지 않는 한) io.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)
텍스트 파일로 작업하고 유니 코드 객체로 투명한 인코딩 및 디코딩을 원할 때.
바이너리 파일을로드하려면
f = io.open(filename, 'b')
.텍스트 파일을 열려면 항상
f = io.open(filename, encoding='utf-8')
명시 적 인코딩을 사용하십시오.
In python 3 however open
does the same thing as io.open
and can be used instead.
Note:
codecs.open
is planned to become deprecated and replaced byio.open
after its introduction in python 2.6. I would only use it if code needs to be compatible with earlier python versions. For more information on codecs and unicode in python see the Unicode HOWTO.
참고URL : https://stackoverflow.com/questions/5250744/difference-between-open-and-codecs-open-in-python
'Program Tip' 카테고리의 다른 글
자바 스크립트에서 모든 시간 초과 / 간격을 보십니까? (0) | 2020.10.12 |
---|---|
파이썬에서 생성자를 복사 하시겠습니까? (0) | 2020.10.12 |
클래스 확장 대 클래스 범주 (0) | 2020.10.12 |
GitHub 위키 디렉토리 (0) | 2020.10.12 |
여러 bash 스크립트에서 pushd / popd 스택을 표시하지 마십시오 (quiet pushd / popd). (0) | 2020.10.12 |