복붙노트

[PYTHON] 파이썬 2로 파이썬 3 오픈 (인코딩 = "utf-8") 백 포트

PYTHON

파이썬 2로 파이썬 3 오픈 (인코딩 = "utf-8") 백 포트

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 ()의 차이점과 인코딩 매개 변수 부족 문제를 해결하기위한 권장 전략은 무엇입니까?

bytestrings을 스트림하는 Python 3 open () 스타일 파일 핸들러를 사용할 수 있습니까? 그러면 Python 2 open ()처럼 작동합니까?

해결법

  1. ==============================

    1.Python 2.6과 2.7 만 지원하면 open 대신 io.open을 사용할 수 있습니다. io는 파이썬 3을위한 새로운 io 서브 시스템이며 파이썬 2,6과 2.7에도 존재합니다. Python 2.6 (및 3.0)에서는 순수하게 Python으로 구현되었으며 속도가 매우 느리기 때문에 파일을 읽을 때 속도가 필요한 경우 좋은 옵션이 아닙니다.

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

    속도가 필요하거나 Python 2.5 또는 이전 버전을 지원해야하는 경우 대신 codecs.open을 사용할 수 있습니다. 그것은 또한 인코딩 파라미터를 가지며, 라인 엔딩을 다르게 처리한다는 점을 제외하면 io.open과 매우 유사합니다.

    open(filename, 'rb')
    

    'b'는 '바이트'를 의미합니다.

  2. ==============================

    2.나는 생각한다.

    나는 생각한다.

    from io import open
    

    해야 할 것.

  3. ==============================

    3.한 가지 방법이 있습니다.

    한 가지 방법이 있습니다.

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

    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 방식으로 코드를 유지할 수 있습니다.

    newline, closefd, opener와 같은 일부 API는 작동하지 않습니다.

  5. from https://stackoverflow.com/questions/10971033/backporting-python-3-openencoding-utf-8-to-python-2 by cc-by-sa and MIT license