개발/Python

Python 3 open (encoding =“utf-8”)을 Python 2로 백 포팅

MinorMan 2021. 4. 17. 14:51
반응형

<질문>

인코딩 매개 변수와 함께 Python 3 스타일 open ()을 사용하는 Python 3 용으로 빌드 된 Python 코드베이스가 있습니다.

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()?


<답변1>

Python 2.6 및 2.7 만 지원해야하는 경우 다음을 사용할 수 있습니다.io.open대신에open.ioPython 3의 새로운 io 하위 시스템이며 Python 2,6 및 2.7에도 존재합니다. Python 2.6 (및 3.0)에서는 순전히 Python으로 구현되고 매우 느리므로 파일 읽기 속도가 필요한 경우 좋은 옵션이 아닙니다.

속도가 필요하고 Python 2.6 또는 이전 버전을 지원해야하는 경우 다음을 사용할 수 있습니다.codecs.open대신. 또한 인코딩 매개 변수가 있으며 다음과 매우 유사합니다.io.open줄 끝을 다르게 처리한다는 점을 제외하면.

open(filename, 'rb')

'이진'을 의미하는 'b'에 유의하십시오.


<답변2>

나는 생각한다

from io import open

해야 할 것.


<답변3>

한 가지 방법은 다음과 같습니다.

with open("filename.txt", "rb") as f:
    contents = f.read().decode("UTF-8")

<답변4>

이것은 트릭을 할 수 있습니다.

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작동하지 않습니다


<답변5>

사용하는 경우six, 최신 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.


<답변6>

일반적인 대답은 아니지만 기본 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
반응형