2011-09-10 5 views
3

파일에 쓸 유니 코드 문자열이 있습니다.파이썬 3.x에서 인코딩 된 문자열을 쓰기() -

파이썬 2에서 내가 쓸 수 :

open('filename', 'w').write(s.encode('utf-8')) 

을하지만 이것은 파이썬 3. 실패 분명히, s.encode()는 쓰기() 함수는 허용하지 않습니다 '바이트'형태의 뭔가를 반환합니다 :

TypeError: must be str, not bytes 

누구든지 위의 코드를 파이썬 3에 포팅하는 방법을 알고 있습니까?

편집 : 바이너리 모드를 사용하여 제안 된 여러분 모두에게

감사합니다! 불행히도, 이로 인해 \ n 문자에 문제가 발생합니다. 파이썬 2와 동일한 결과를 얻을 수있는 방법이 있습니까 (즉, \ n의 OS 관련 변환을 유지하면서 비 ANSI 문자를 UTF-8로 인코딩하는 방법)?

감사합니다.

답변

2

열기 바이너리 모드에서 파일의 파일, 즉 변화의 측면에서 최소 침습적 방법이다.

반면에 open()을 사용하여 출력 파일 인코딩을 설정하고 명시 적 문자열 인코딩을 피할 수 있습니다.

open() 기능의 설명서를 읽을 수 있습니다.

+0

파이썬 초보자는 ** 텍스트 ** 파일로 작업하는 두 가지 유효한 옵션이 있다는 것을 알았 기 때문에이 대답을 받아 들였습니다.이 경우에는'open'을'encoding'으로 설정해야합니다() 파일을 만들거나 ** 바이너리 ** 파일로 만들었는데, 이는 이전에 가지고 있던 것과 매우 비슷할 것이다. (하지만 줄 바꿈을 처리하는 데 어려움을 겪지 만, 나는 그들을 치료할 수있는 약간의 노력으로 너무). 지금까지 ** text ** ('str')과 (binary) ** data ** ('bytes')를 구별하는 Python 3.x 방식을 알고 감사하게되었습니다. – Tom

0

열기 바이너리 모드

open('filename', 'wb').write(s.encode('utf-8')) 
+0

너무 많은 문제가 있습니다. – tchrist

10

너는 이 아니고과 같이 수동으로 각각의 모든 데이터 조각을 인코딩하려고합니다. 당신이 만든 파일이, 당신이 말하는 것을 볼 수 있습니다 당신이 경우 지금

#!/usr/bin/env python3.2 

slist = [ 
    "Ca\N{LATIN SMALL LETTER N WITH TILDE}on City", 
    "na\N{LATIN SMALL LETTER I WITH DIAERESIS}vet\N{LATIN SMALL LETTER E WITH ACUTE}", 
    "fa\N{LATIN SMALL LETTER C WITH CEDILLA}ade", 
    "\N{GREEK SMALL LETTER BETA}-globulin" 
] 

with open("/tmp/sample.utf8", mode="w", encoding="utf8") as f: 
    for s in slist: 
     print(s, file=f) 

을 : 간단하게 다음과 같이 open에 인수로 인코딩을 통과

$ cat /tmp/sample.utf8 
Cañon City 
naïveté 
façade 
β-globulin 

그리고 당신은 그는 것을 알 수 있습니다 올바른 코드 포인트 이러한 방법 :

$ uniquote -x /tmp/sample.utf 
Ca\x{F1}on City 
na\x{EF}vet\x{E9} 
fa\x{E7}ade 
\x{3B2}-globulin 

가 얼마나 더 쉽게보기? 스트림 객체가 당신을 위해 저수준의 인코딩이나 디코딩을 처리하도록합니다.

요약 :encode 또는 decode 자신이 동일한 인코딩에 모두의 균일 한 스트림을 처리하기 위해 그들을 사용하여 당신이하고있는 모든 때 호출하지 마십시오. 그건 제로 게인을 너무 괴롭히는 것입니다. encoding 인수를 한 번만 사용하십시오.

+2

3.2에서'with '를 사용하지 않을 이유가 없습니다. 또한'f.close()'가 아니라'f.닫습니다. – agf

+0

@agf Ug, 네 말이 맞아. 파이썬으로 하여금 그런 바보 같은 실수에 대해 어떻게 경고하게합니까? Perl에서 나는 "무효 맥락에서 상수의 쓸모없는 사용"을 얻었을 것이다. – tchrist

+0

@Lennart : 고마워,하지만 왜 더 나아 졌니? 'f'에 대한 스코핑 제어? – tchrist

관련 문제