Python 3 open(python="utf-8")을 Python 2로 백포팅합니다.
저는 Python 3용으로 구축된 Python 코드베이스를 가지고 있는데, 이 코드베이스는 다음과 같은 인코딩 매개 변수가 있는 Python 3 스타일 open()을 사용합니다.
https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47
with open(fname, "rt", encoding="utf-8") as f:
이제 이 코드를 Python 2.x로 백포트하여 Python 2와 Python 3에서 작동하는 코드베이스를 만들고 싶습니다.
해결할 수 있는 권장 전략은 무엇입니까?open()
인코딩 매개 변수의 차이와 부족?
파이썬 3을 주시겠습니까?open()
테스트 문자열로 스트리밍하여 Python 2처럼 동작하는 스타일 파일 핸들러open()
?
Python 2에서 인코딩 매개 변수를 가져오는 방법
Python 2.6 및 2.7만 지원해야 하는 경우 대신 사용할 수 있습니다.open
.io
Python 3의 새로운 io 하위 시스템이며, Python 2.6 및 2.7에도 존재합니다.Python 2.6(및 3.0)에서는 순수하게 Python으로 구현되며 매우 느리기 때문에 파일 읽기 속도가 필요하다면 좋은 옵션이 아닙니다.
속도가 필요하고 Python 2.6 이전 버전을 지원해야 하는 경우 대신 사용할 수 있습니다.또한 인코딩 매개 변수가 있으며 다음과 매우 유사합니다.io.open
줄 끝을 다르게 처리한다는 점을 제외하고는.
Python 3을 얻는 방법open()
테스트 문자열로 스트리밍하는 스타일 파일 핸들러:
open(filename, 'rb')
'b'는 '이진'을 의미합니다.
생각합니다
from io import open
해야 합니다.
한 가지 방법이 있습니다.
with open("filename.txt", "rb") as f:
contents = f.read().decode("UTF-8")
다음은 작성 시 동일한 작업을 수행하는 방법입니다.
with open("filename.txt", "wb") as f:
f.write(contents.encode("UTF-8"))
이렇게 하면 효과가 있을 수 있습니다.
import sys
if sys.version_info[0] > 2:
# py3k
pass
else:
# py2
import codecs
import warnings
def open(file, mode='r', buffering=-1, encoding=None,
errors=None, newline=None, closefd=True, opener=None):
if newline is not None:
warnings.warn('newline is not supported in py2')
if not closefd:
warnings.warn('closefd is not supported in py2')
if opener is not None:
warnings.warn('opener is not supported in py2')
return codecs.open(filename=file, mode=mode, encoding=encoding,
errors=errors, buffering=buffering)
그러면 당신은 python3 방식으로 코드를 유지할 수 있습니다.
일부 API는 다음과 같습니다.newline
,closefd
,opener
효과가 없는
를 사용하는 경우 최신 Python 3 API를 활용하고 Python 2/3에서 모두 실행할 수 있는 이 기능을 사용해 볼 수 있습니다.
import six
if six.PY2:
# FileNotFoundError is only available since Python 3.3
FileNotFoundError = IOError
from io import open
fname = 'index.rst'
try:
with open(fname, "rt", encoding="utf-8") as f:
pass
# do_something_with_f ...
except FileNotFoundError:
print('Oops.')
그리고 Python 2 지원 포기는 다음과 관련된 모든 것을 삭제하는 것입니다.six
.
일반적인 답변은 아니지만 기본 python 2 인코딩에 만족하지만 python 3에 대해 utf-8을 지정하고자 하는 특정 경우에 유용할 수 있습니다.
if sys.version_info.major > 2:
do_open = lambda filename: open(filename, encoding='utf-8')
else:
do_open = lambda filename: open(filename)
with do_open(filename) as file:
pass
언급URL : https://stackoverflow.com/questions/10971033/backporting-python-3-openencoding-utf-8-to-python-2
'programing' 카테고리의 다른 글
"앱스토어 연결 작업 오류 ITMS-90771" 수정 방법 (0) | 2023.05.03 |
---|---|
Azure 함수에 대한 다중 트리거 (0) | 2023.05.03 |
SQL 다중 열 순서 지정 (0) | 2023.05.03 |
postgresql COUNT(DISTINCT...) 매우 느림 (0) | 2023.05.03 |
Azure DevOps에서 파일의 원시 콘텐츠에 대한 링크를 가질 수 있습니까? (0) | 2023.05.03 |