programing

Python에서 UTF-8 파일에 쓰기

copysource 2023. 1. 14. 10:25
반응형

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

반응형