1 回答

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個贊
問題在于您正在以文本模式打開文件,但是試圖將其用作二進(jìn)制文件。
這個:
u"\r\n".encode("utf-16")
…編碼為'\r\0\n\0'。
然后這樣:
f.write('\r\0\n\0')
…將Unix換行符轉(zhuǎn)換為Windows換行符,給出'\r\0\r\n\0'。
而且,這當(dāng)然會破壞您的UTF-16編碼。除了這兩個\r\n字節(jié)將解碼為有效但未分配的代碼點(diǎn)U + 0A0D的事實(shí)之外,這是一個奇數(shù)個字節(jié),這意味著您還有一個余數(shù)\0。因此,它不是L\0的下一個字符,而是\0L,aka?等。
最重要的是,您可能正在為每個編碼字符串編寫一個新的UTF-16 BOM。大多數(shù)Windows應(yīng)用程序?qū)嶋H上會透明地處理該問題并忽略它們,因此您實(shí)際上所做的只是浪費(fèi)兩個字節(jié)/行,但這實(shí)際上是不正確的。
解決第一個問題的快速方法是以二進(jìn)制模式打開文件:
f = open("testfile.txt", "wb")
這不能解決多物料清單問題,但可以解決損壞的\n問題。如果要解決BOM表問題,則可以使用有狀態(tài)編碼,或者為除首次寫入外的所有寫入明確指定'utf-16-le'(或'utf-16-be')。
但是,解決這兩個問題的簡單方法是使用模塊(對于舊的Python 2.x,則使用該模塊)為您完成所有艱苦的工作:iocodecs
f = io.open("testfile.txt", "w", encoding="utf-8")
f.write("Line one")
f.write(u"\r\n")
f.write("Line two")
添加回答
舉報(bào)