2010-02-02 36 views
11

我有一個非常長的文本文件,我正在嘗試使用Python進行處理。Python認爲3000行文本文件是一行長嗎?

但是,下面的代碼:

for line in open('textbase.txt', 'r'): 
    print 'hello world' 

只產生以下的輸出:

hello world 

就好像Python中認爲該文件是隻有一條線長,雖然它是成千上萬行很長,當在文本編輯器中查看。檢查它使用文件命令在命令行上給出:

$ file textbase.txt 
textbase.txt: Big-endian UTF-16 Unicode English text, with CR line terminators 

有什麼不對?我是否需要更改行終止符?

+0

什麼OS是你嗎? – 2010-02-02 14:13:28

+0

@OP,textbase.txt從哪裏來?視窗?嘗試在文件上做一個dos2unix,看到它解決了問題 – ghostdog74 2010-02-02 14:13:27

+0

@jldupont:我認爲AP257期望它爲輸入文件的每一行輸出「hello world」,就像代碼所示:-) – paxdiablo 2010-02-02 14:13:31

回答

6

你可能會發現它是「帶CR終結者」,讓遊戲離開。如果您正在使用換行符作爲行結束符的平臺上工作,它將看作您的文件作爲一個大的honkin'行。

更改您的輸入文件,以便它使用正確的行結束符。你的編輯器可能比你的Python實現更寬容。

就我所知,CR行結束符是Mac的事情,您可以使用U模式修飾符open根據找到的第一行終止符進行自動檢測。

+0

'美甲+頭組合我認爲。 +1。 – 2010-02-02 14:12:57

+0

謝謝。任何想法我需要改變他們? – AP257 2010-02-02 14:13:45

+0

我會說'\ n'。 – 2010-02-02 14:14:40

-1

open()返回文件對象。您需要使用:

for line in open('textbase.txt', 'r').readlines(): 
    print line 
+2

這不是必需的,因爲打開的文件對象的行爲就像一個迭代器。 – 2010-02-02 14:12:01

+0

沒有區別,對不起... – AP257 2010-02-02 14:12:43

+0

啊...好點。沒有讚揚這一點。 – Paul 2010-02-02 14:14:59

25

按照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

+0

+1爲解決方案,而不僅僅是分析(如我的答案) - 你對我來說太快了:-) – paxdiablo 2010-02-02 14:17:20

+0

解決了這個問題,python現在看到了所有的行。非常感謝:我喜歡這個網站:) – AP257 2010-02-02 14:18:38

+1

@ AP257:他們也解碼正確嗎?如果它真的是UTF-16BE,那麼每行前面會有零字節,因爲Python的文件對象是編碼不知道的,只是在換行符上分割。恕我直言,你必須解碼文件(通過使用編解碼器模塊)正確地分割成行之前是可能的。 – 2010-02-02 14:24:08

相關問題