按照documentation for open()
,你應該添加一個U
的模式:
open('textbase.txt', 'Ur')
這使得「universal newlines」,其中他們歸到\n
在它給你的琴絃。
但是,正確的做法是在翻譯換行符之前將UTF-16BE解碼爲Unicode對象第一個。否則,一有機會0x0d
字節可以得到錯誤地變成了0x0a
,導致
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 12: truncated data.
Python的codecs
module提供一個open
功能可以解碼Unicode和同時處理的新行:
import codecs
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'):
...
如果文件具有字節順序標記(BOM),並且您指定'utf-16'
,則它會檢測字節序併爲您隱藏BOM。如果沒有(因爲BOM是可選的),那麼解碼器將繼續使用您的系統的字節序,這可能不會很好。
指定字節序自己(與'utf-16be'
)將不會隱藏BOM,所以你可能希望使用這個技巧:
import codecs
firstline = True
for line in codecs.open('textbase.txt', 'Ur', 'utf-16be'):
if firstline:
firstline = False
line = line.lstrip(u'\ufeff')
參見:Python Unicode HOWTO
什麼OS是你嗎? – 2010-02-02 14:13:28
@OP,textbase.txt從哪裏來?視窗?嘗試在文件上做一個dos2unix,看到它解決了問題 – ghostdog74 2010-02-02 14:13:27
@jldupont:我認爲AP257期望它爲輸入文件的每一行輸出「hello world」,就像代碼所示:-) – paxdiablo 2010-02-02 14:13:31