[英]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.