python文件写入utf-8_关于utf 8:用Python写入UTF-8文件
我真的對codecs.open function很困惑。當(dāng)我這樣做的時候:
file = codecs.open("temp","w","utf-8")
file.write(codecs.BOM_UTF8)
file.close()
它給了我錯誤
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position
0: ordinal not in range(128)
如果我這樣做:
file = open("temp","w")
file.write(codecs.BOM_UTF8)
file.close()
它很好用。
問題是為什么第一種方法失敗了?如何插入物料清單?
如果第二種方法是正確的方法,那么使用codecs.open(filename,"w","utf-8")有什么意義?
不要使用UTF-8格式的BOM。拜托。
@克里斯蒂安?為什么不呢?
@UTF-8中不需要salmanpk-bom,只會增加復(fù)雜性(例如,不能將bom的文件和結(jié)果與有效文本連接在一起)??吹竭@個問題,不要錯過問題下面的重要評論。
我認(rèn)為問題在于codecs.BOM_UTF8是字節(jié)字符串,而不是Unicode字符串。我懷疑文件處理程序試圖根據(jù)"我打算將Unicode作為UTF-8編碼文本寫入,但您給了我一個字節(jié)字符串"來猜測您真正的意思!
嘗試直接為字節(jié)順序標(biāo)記(即unicode u+feff)編寫unicode字符串,以便文件將其編碼為utf-8:
import codecs
file = codecs.open("lol","w","utf-8")
file.write(u'\ufeff')
file.close()
(這似乎給出了正確的答案——一個包含字節(jié)ef bb bf的文件。)
edit:s.lott建議使用"utf-8-sig"作為編碼,這比自己顯式地編寫B(tài)OM要好,但我將把這個答案留在這里,因為它解釋了以前發(fā)生的問題。
多謝你這么做,肯定讓事情更清楚了。
警告:打開和打開不同。如果您執(zhí)行"從編解碼器導(dǎo)入打開",它將不會與您只需鍵入"打開"相同。
您也可以使用codecs.open("test.txt"、"w"、"utf-8-sig")。
我得到"typeerror:需要一個整數(shù)(得到str類型)"。我不明白我們在這里做什么。有人能幫忙嗎?我需要在文本文件中附加一個字符串(段落)。在寫之前我需要先把它轉(zhuǎn)換成整數(shù)嗎?
@穆根:據(jù)我所知,我寫的確切代碼工作得很好。我建議你問一個新的問題,精確地顯示你得到了什么代碼,以及錯誤發(fā)生在哪里。
@穆根,你需要打電話給codecs.open,而不是直接打給open
閱讀以下內(nèi)容: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
")
temp.write(u"This has ?")
生成的文件是帶有預(yù)期BOM的UTF-8。
謝謝。這是有效的(Windows7x64,python 2.7.5x64)。當(dāng)您以模式"A"(附加)打開文件時,此解決方案工作良好。
首先是import codecs。
這對我不起作用,Windows上的python 3。我必須用open(file_name,'wb')作為bom file:bom file.write(codecs.bom_utf8)來代替,然后重新打開該文件進行append。
@S-LOTT給出了正確的過程,但是在Unicode問題上進行擴展,Python解釋器可以提供更多的見解。
jon skeet對于codecs模塊是正確的(不尋常的),它包含字節(jié)字符串:
>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>>
選擇另一個NIT,BOM有一個標(biāo)準(zhǔn)的Unicode名稱,可以輸入為:
>>> bom= u"
{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'
也可通過unicodedata訪問:
>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>
我使用file*nix命令將未知字符集文件轉(zhuǎn)換為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()
現(xiàn)在,您還可以使用chardet。
使用# coding: utf8而不是# -*- coding: utf-8 -*-,這更容易記住。
總結(jié)
以上是生活随笔為你收集整理的python文件写入utf-8_关于utf 8:用Python写入UTF-8文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三人成虎,概率却不足十分之五?几个贝叶斯
- 下一篇: 三亚潜水注意事项 潜水的基本常识