2011-04-08 21 views
1

我使用Python來讀取一個txt文件:爲什麼第一行更長?

f = open(path,"r") 
for line in f: 
    line = line.decode('utf8').strip() 
    length = len(line) 
    firstLetter = line[:1] 

似乎工作,但第一線的長度總是長的... 1

例如: 第一線是「XXXX」,其中X表示中國字符 然後長度將是5,而不是4 和firstLetter將一無所獲

但是當它進入到第二和行之後,它工作正常

tks〜

+0

什麼是'ord(firstLetter)'得到你嗎? – 2011-04-08 03:34:45

+0

它說65279,那是什麼?這不是一個正常的字符 – MangMang 2011-04-08 03:58:58

+0

它是BOM(實際上是一個零寬度的不間斷空間),如下面的答案所述。它看起來沒有什麼東西,因爲它是非打印字符。 – 2011-04-08 04:02:10

回答

5

你必須在你的文件的開始UTF-8 BOM。不要關心檢查第一個字符。代替utf8編碼,請使用utf_8_sig encodingcodecs.open()your_byte_string.decode() ......如果它存在並且您沒有在代碼中看到它,則會吸收BOM。

>>> bom8 = u'\ufeff'.encode('utf8') 
>>> bom8 
'\xef\xbb\xbf' 
>>> bom8.decode('utf8') 
u'\ufeff' 
>>> bom8.decode('utf_8_sig') 
u'' # removes the BOM 
>>> 'abcd'.decode('utf_8_sig') 
u'abcd' # doesn't care if no BOM 
>>> 
+0

它的工作原理,謝謝你! – MangMang 2011-04-08 04:19:48

5

您可能獲得了Byte Order Mark (BOM)作爲第一行的第一個字符。

關於處理它的信息是here

+0

對不起,我在中國,所以我不能打開該網站。我在谷歌搜索,它說EditPlus添加到utf8文件的BOM。所以我改變了設置爲「總是刪除簽名」,但它不起作用 – MangMang 2011-04-08 04:01:36

+0

@MangMang,別擔心,該網站邀請你做複雜的無意義代碼(自己檢查第一個字符)。看到我的答案。 – 2011-04-08 04:18:46

相關問題