Python에서 UTF-8 파일에 쓰기
저는 정말 혼란스러워요.codecs.open function
할 때:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
그것은 나에게 오류를 준다.
UnicodeDecodeError: 'ascii' 코덱이 0의 바이트 0xef를 디코딩할 수 없습니다. 서수가 범위(128) 내에 없습니다.
이 경우:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
잘 되고 있어요.
문제는 첫 번째 방법이 왜 실패하느냐는 것입니다.그리고 BOM은 어떻게 삽입하나요?
두 번째 방법이 올바른 방법일 경우,codecs.open(filename, "w", "utf-8")
?
유니코드 문자열이 아닌 바이트 문자열이 문제인 것 같습니다.파일 핸들러는 "UTF-8 인코딩 텍스트로 유니코드를 쓰려고 하는데 바이트 문자열을 주셨어요!"라는 내용을 바탕으로 당신의 진의를 추측하고 있는 것 같습니다.
바이트 순서 마크(즉, Unicode U+FEF)의 Unicode 문자열을 직접 써보고, 파일을 UTF-8로 인코딩합니다.
import codecs
file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()
(이것이 올바른 답인 것 같습니다.바이트 EF BB BF 파일입니다.)
편집: "utf-8-sig"를 인코딩으로 사용하자는 S. Lott의 제안은 BOM을 직접 작성하는 것보다 더 낫습니다만, 이 답변은 이전에 어떤 문제가 있었는지를 설명하고 있기 때문에 여기에 남겨두겠습니다.
다음 문서를 참조하십시오.http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig
이렇게 해 주세요.
with codecs.open("test_output", "w", "utf-8-sig") as temp:
temp.write("hi mom\n")
temp.write(u"This has ♭")
결과 파일은 예상되는 BOM을 가진 UTF-8입니다.
이것을 사용하는 것만으로 매우 간단합니다.라이브러리는 필요 없습니다.
with open('text.txt', 'w', encoding='utf-8') as f:
f.write(text)
@S-Lott는 올바른 절차를 제공하지만, 유니코드 문제에 대한 확장으로 Python 인터프리터는 더 많은 통찰력을 제공할 수 있습니다.
Jon Sket은 모듈에 대해 (비정상적인) 옳습니다.이 모듈에는 바이트 문자열이 포함되어 있습니다.
>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>>
또 다른 니트를 골라서BOM
에는 표준 유니코드 이름이 있으며 다음과 같이 입력할 수 있습니다.
>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'
다음의 방법으로도 액세스 할 수 있습니다.
>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>
file *nix 명령어를 사용하여 utf-8 파일의 알 수 없는 charset 파일을 변환합니다.
# -*- encoding: utf-8 -*-
# converting a unknown formatting file in utf-8
import codecs
import commands
file_location = "jumper.sub"
file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location)
file_stream = codecs.open(file_location, 'r', file_encoding)
file_output = codecs.open(file_location+"b", 'w', 'utf-8')
for l in file_stream:
file_output.write(l)
file_stream.close()
file_output.close()
pathlib을 사용하는 python 3.4 > =:
import pathlib
pathlib.Path("text.txt").write_text(text, encoding='utf-8') #or utf-8-sig for BOM
팬더처럼 팬더 I/O 방식을 사용하는 경우.to_crypto는 부호화 파라미터를 추가합니다.예를 들어 다음과 같습니다.
pd.to_excel("somefile.xlsx", sheet_name="export", encoding='utf-8')
이것은 내가 생각하는 대부분의 국제적인 캐릭터들에게 효과가 있다.
언급URL : https://stackoverflow.com/questions/934160/write-to-utf-8-file-in-python
'programing' 카테고리의 다른 글
유사한 데이터를 올바른 방법으로 표를 만드는 방법 (0) | 2023.01.14 |
---|---|
문자열이 비어 있는지 확인하는 함수가 항상 true를 반환하는 이유는 무엇입니까? (0) | 2023.01.14 |
케이스당 여러 개의 값을 가진 PHP 스위치를 사용하는 가장 좋은 방법은 무엇입니까? (0) | 2022.12.10 |
Java Swing에서 오른쪽 클릭 컨텍스트메뉴를 작성하려면 어떻게 해야 하나요? (0) | 2022.12.10 |
IntelliJ에서 테스트 클래스 만들기 (0) | 2022.12.10 |