簡體   English   中英

在Python中寫入UTF-8文件

[英]Write to UTF-8 file in Python

我真的對codecs.open function感到困惑。 當我做:

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

它給了我錯誤

UnicodeDecodeError:“ascii”編解碼器無法解碼 position 中的字節 0xef 0:序號不在范圍內(128)

如果我做:

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

它工作正常。

問題是為什么第一種方法失敗了? 以及如何插入 bom?

如果第二種方法是正確的方法,那么使用codecs.open(filename, "w", "utf-8")什么意義?

我相信問題在於codecs.BOM_UTF8是一個字節字符串,而不是一個 Unicode 字符串。 我懷疑文件處理程序試圖根據“我打算將 Unicode 編寫為 UTF-8 編碼文本,但您給了我一個字節字符串!”來猜測您的真正意思。

嘗試直接編寫字節順序標記的 Unicode 字符串(即 Unicode U+FEFF),以便文件僅將其編碼為 UTF-8:

import codecs

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

(這似乎給出了正確的答案 - 一個包含字節 EF BB BF 的文件。)

編輯:S. Lott建議使用“utf-8-sig”作為編碼比自己明確編寫 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。

@S-Lott 給出了正確的程序,但擴展了Unicode問題, Python解釋器可以提供更多見解。

Jon Skeet 關於codecs模塊是正確的(不尋常的)——它包含字節字符串:

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

選擇另一個 nit, BOM有一個標准的Unicode名稱,它可以輸入為:

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

它也可以通過unicodedata訪問:

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

我使用 file *nix 命令將未知字符集文件轉換為 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()

使用這個非常簡單。 不需要任何庫。

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

python 3.4 >= 使用路徑庫:

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

如果您正在使用 Pandas I/O 方法,如 pandas.to_excel(),請添加一個編碼參數,例如

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

這適用於我相信的大多數國際角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM