Hướng dẫn python write utf 8 file - python ghi tập tin utf 8

Tôi thực sự bối rối với

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
0. Khi tôi làm:

file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()

Nó cho tôi lỗi

UnicodedEcodeError: 'ASCII' codec không thể giải mã byte 0xef ở vị trí 0: Ordinal không trong phạm vi (128)

Nếu tôi làm:

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()

Nó hoạt động tốt.

Câu hỏi là tại sao phương pháp đầu tiên thất bại? Và làm thế nào để tôi chèn bom? is why does the first method fail? And how do I insert the bom?

Nếu phương pháp thứ hai là cách chính xác để thực hiện nó, thì điểm sử dụng

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
1 là gì?

Hướng dẫn python write utf 8 file - python ghi tập tin utf 8

DREFTYMAC

30.5K26 Huy hiệu vàng116 Huy hiệu bạc179 Huy hiệu đồng26 gold badges116 silver badges179 bronze badges

Đã hỏi ngày 1 tháng 6 năm 2009 lúc 9:42Jun 1, 2009 at 9:42

John Jiangjohn JiangJohn Jiang

10,6K11 Huy hiệu vàng50 Huy hiệu bạc60 Huy hiệu đồng11 gold badges50 silver badges60 bronze badges

3

Tôi tin rằng vấn đề là

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
2 là chuỗi byte, không phải là chuỗi unicode. Tôi nghi ngờ trình xử lý tệp đang cố gắng đoán ý bạn thực sự dựa trên "Tôi có nghĩa là viết Unicode dưới dạng văn bản được mã hóa UTF-8, nhưng bạn đã cho tôi một chuỗi byte!"

Hãy thử viết chuỗi unicode cho dấu lệnh byte (tức là Unicode U+Feff) trực tiếp, để tệp chỉ mã hóa đó là UTF-8:

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(Điều đó dường như đưa ra câu trả lời đúng - một tệp có byte ef bb bf.)

EDIT: Đề xuất của S. Lott về việc sử dụng "UTF-8-SIG" vì mã hóa là một đề xuất tốt hơn là tự viết BOM một cách rõ ràng, nhưng tôi sẽ để lại câu trả lời này ở đây vì nó giải thích những gì đang xảy ra trước đây.

Hướng dẫn python write utf 8 file - python ghi tập tin utf 8

Zanon

Phù hiệu vàng 27.5K20 Hiệu phù vàng123 Huy hiệu đồng20 gold badges111 silver badges123 bronze badges

Đã trả lời ngày 1 tháng 6 năm 2009 lúc 9:46Jun 1, 2009 at 9:46

Jon Skeetjon SkeetJon Skeet

14M840 Huy hiệu vàng9003 Huy hiệu bạc9110 Huy hiệu Đồng840 gold badges9003 silver badges9110 bronze badges

5

Nó rất đơn giản chỉ cần sử dụng điều này. Không có bất kỳ thư viện cần thiết.Not any library needed.

with open('text.txt', 'w', encoding='utf-8') as f:
    f.write(text)

Đã trả lời ngày 12 tháng 8 năm 2021 lúc 11:17Aug 12, 2021 at 11:17

Hướng dẫn python write utf 8 file - python ghi tập tin utf 8

Kamran Gasimovkamran GasimovKamran Gasimov

1.1311 Huy hiệu vàng13 Huy hiệu bạc11 Huy hiệu đồng1 gold badge13 silver badges11 bronze badges

@S-Lott đưa ra quy trình phù hợp, nhưng mở rộng các vấn đề về Unicode, trình thông dịch Python có thể cung cấp nhiều hiểu biết hơn.

Jon Skeet đúng (bất thường) về mô -đun

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
3 - nó chứa chuỗi byte:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>> 

Chọn một NIT khác,

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
4 có tên Unicode tiêu chuẩn và nó có thể được nhập như:

>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'

Nó cũng có thể truy cập thông qua

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
5:

>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>> 

Tzot

89,7K29 Huy hiệu vàng138 Huy hiệu bạc202 Huy hiệu đồng29 gold badges138 silver badges202 bronze badges

Đã trả lời ngày 1 tháng 6 năm 2009 lúc 10:12Jun 1, 2009 at 10:12

Gimelgimelgimel

80.6K10 Huy hiệu vàng74 Huy hiệu bạc104 Huy hiệu đồng10 gold badges74 silver badges104 bronze badges

0

Tôi sử dụng lệnh File *Nix để chuyển đổi tệp Charset không xác định trong tệp UTF-8

# -*- 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()

Đã trả lời ngày 8 tháng 2 năm 2012 lúc 20:35Feb 8, 2012 at 20:35

RicardoricardoRicardo

5988 Huy hiệu bạc11 Huy hiệu đồng8 silver badges11 bronze badges

2

Python 3.4> = sử dụng pathlib:

import pathlib
pathlib.Path("text.txt").write_text(text, encoding='utf-8') #or utf-8-sig for BOM

Đã trả lời ngày 8 tháng 4 lúc 20:52Apr 8 at 20:52

Hướng dẫn python write utf 8 file - python ghi tập tin utf 8

Celsowmcelsowmcelsowm

6929 Huy hiệu vàng30 Huy hiệu bạc56 Huy hiệu Đồng9 gold badges30 silver badges56 bronze badges

Nếu bạn đang sử dụng các phương thức I/O Pandas như pandas.to_excel (), hãy thêm tham số mã hóa, ví dụ:

pd.to_excel("somefile.xlsx", sheet_name="export", encoding='utf-8')

Điều này làm việc cho hầu hết các nhân vật quốc tế mà tôi tin.

Đã trả lời ngày 8 tháng 12 năm 2021 lúc 12:04Dec 8, 2021 at 12:04