이 문제는 일반적으로 py2에서 py3으로 전환 할 때 발생합니다. py2 plaintext
에서 문자열 및 바이트 배열 유형입니다. py3에 plaintext
불과하다 문자열 및 방법은 outfile.write()
실제로 얻어 바이트 배열 될 때 outfile
, 예외가 발생되어 있으므로, 바이너리 모드에서 개방된다. 입력을 변경하여 plaintext.encode('utf-8')
문제를 해결하십시오. 이것이 당신을 귀찮게하는지 읽어보십시오.
py2에서 file.write 선언 은 문자열로 전달 된 것처럼 보입니다 file.write(str)
. 실제로 바이트 배열을 전달할 때 다음과 같은 선언을 읽었을 것 file.write(bytes)
입니다. 당신은 문제가 간단하게 다음과 같이 읽을 경우, file.write(bytes)
A가 필요 바이트 얻을 종류와 py3에를 바이트를 밖으로의 str을 당신이 그것을 변환 :
py3>> outfile.write(plaintext.encode('utf-8'))
py2 docs가 왜 file.write
문자열을 사용 한다고 선언 했습니까? py2에서 선언 구별은 중요하지 않았습니다.
py2>> str==bytes #str and bytes aliased a single hybrid class in py2
True
py2 의 str-bytes 클래스에는 어떤 방법으로 문자열 클래스처럼 작동하고 다른 방법으로 바이트 배열 클래스처럼 동작하도록하는 메소드 / 생성자가 있습니다. 편리 file.write
하지 않습니까? :
py2>> plaintext='my string literal'
py2>> type(plaintext)
str #is it a string or is it a byte array? it's both!
py2>> outfile.write(plaintext) #can use plaintext as a byte array
py3가 왜이 멋진 시스템을 깨뜨 렸습니까? py2에서 기본 문자열 함수는 다른 세계에서는 작동하지 않았기 때문에. ASCII가 아닌 문자로 단어의 길이를 측정 하시겠습니까?
py2>> len('¡no') #length of string=3, length of UTF-8 byte array=4, since with variable len encoding the non-ASCII chars = 2-6 bytes
4 #always gives bytes.len not str.len
이번에 는 py2에서 문자열 의 len 을 요구한다고 생각 하고 인코딩에서 바이트 배열의 길이를 얻었습니다. 그 모호성은 이중 의무 수업의 근본적인 문제입니다. 어떤 버전의 메소드 호출을 구현합니까?
좋은 소식은 py3 이이 문제를 해결한다는 것입니다. str 및 bytes 클래스를 분리합니다 . STR의 클래스를 갖는 문자열과 같은 방법의 개별 바이트 클래스 바이트 배열 방법이있다 :
py3>> len('¡ok') #string
3
py3>> len('¡ok'.encode('utf-8')) #bytes
4
이 점을 알면 문제를 이해하기 어렵고 마이그레이션 고통을 좀 더 쉽게 해결할 수 있습니다.