Hướng dẫn write utf-8 to file python - viết utf-8 vào tệp python

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 write utf-8 to file python - viết utf-8 vào tệp python

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 write utf-8 to file python - viết utf-8 vào tệp python

Zanon

Phù hiệu vàng 27.6K20 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

1.4M842 Huy hiệu vàng9007 Huy hiệu bạc9113 Huy hiệu Đồng842 gold badges9007 silver badges9113 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 write utf-8 to file python - viết utf-8 vào tệp python

Kamran Gasimovkamran GasimovKamran Gasimov

1.1411 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,8K29 Huy hiệu vàng138 Huy hiệu bạc201 Huy hiệu đồng29 gold badges138 silver badges201 bronze badges

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

Gimelgimelgimel

Huy hiệu vàng 80,8K1010 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 write utf-8 to file python - viết utf-8 vào tệp python

Celsowmcelsowmcelsowm

6929 Huy hiệu vàng30 Huy hiệu bạc57 Huy hiệu Đồng9 gold badges30 silver badges57 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

Python có phải là UTF không

Sử dụng phương thức String Encode (), bạn có thể chuyển đổi chuỗi Unicode thành bất kỳ mã hóa nào được hỗ trợ bởi Python.Theo mặc định, Python sử dụng mã hóa UTF-8.By default, Python uses utf-8 encoding.

Python có mặc định cho UTF không

Mã hóa mặc định của các tệp nguồn Python là UTF-8.JSON, TOML, YAML sử dụng UTF-8.Hầu hết các trình chỉnh sửa văn bản bao gồm VS Code và Windows Notepad đều sử dụng UTF-8 theo mặc định.Hầu hết các trang web và dữ liệu văn bản trên Internet đều sử dụng UTF-8.. JSON, TOML, YAML uses UTF-8. Most text editors including VS Code and Windows notepad use UTF-8 by default. Most websites and text data on the internet uses UTF-8.

Python có sử dụng UTF 16 không?

Python 3.3 không còn sử dụng UTF-16, thay vào đó, một mã hóa cho phép biểu diễn nhỏ gọn nhất cho chuỗi đã cho được chọn từ ASCII/Latin-1, UCS-2 và UTF-32.Java ban đầu đã sử dụng UCS-2 và thêm hỗ trợ ký tự bổ sung UTF-16 trong J2SE 5.0.JavaScript có thể sử dụng UCS-2 hoặc UTF-16., instead an encoding that gives the most compact representation for the given string is chosen from ASCII/Latin-1, UCS-2, and UTF-32. Java originally used UCS-2, and added UTF-16 supplementary character support in J2SE 5.0. JavaScript may use UCS-2 or UTF-16.

Python có hỗ trợ Unicode không?

1. Python 2 sử dụng loại STR để lưu trữ byte và loại unicode để lưu trữ các điểm mã Unicode.Tất cả các chuỗi theo mặc định là loại str - đó là byte ~ và mã hóa mặc định là ASCII.