2011-11-30 65 views
1

我試圖採取一個文本文件,並只使用它的前30行在Python中。 這是我寫的:在Python中使用文本文件

text = open("myText.txt") 
lines = myText.readlines(30) 
print lines 

由於某種原因,我得到更多的則150線當我打印? 我在做什麼錯?

+6

不應該'線=文本.readlines(30)'? –

回答

2

readlines的參數sizehint不是您認爲的那樣(字節,不是行)。

如果您確實想使用readlines,請嘗試使用text.readlines()[:30]

請注意,這對於大文件來說效率不高,因爲它在返回片段之前首先創建包含整個文件的列表。

直接的解決方案是在循環內使用readline(如mac's answer所示)。

要處理各種大小(大於或小於30)的文件,Andrew's answer使用itertools.islice()提供了一個可靠的解決方案。以實現類似的結果,而不itertools,考慮:

output = [line for _, line in zip(range(30), open("yourfile.txt", "r"))] 

或作爲發電機表達式(Python的> 2.4):

output = (line for _, line in zip(range(30), open("yourfile.txt", "r"))) 
for line in output: 
    # do something with line. 
+1

不完全確定,但是不會將所有行讀入內存中,然後保持前30個? – mac

+0

@mac更新中的地址。 –

4

如果你要單獨處理你的線條,另一種可能是使用一個循環:

file = open('myText.txt') 
for i in range(30): 
    line = file.readline() 
    # do stuff with line here 

編輯:了一些關於這種方法假定表示關注下面的評論中,至少有30文件中的行。如果這對您的應用程序來說是個問題,那麼您可以在處理之前檢查行的值。 readline()會返回一個空字符串''一旦EOF已經達到:要在閱讀

for i in range(30): 
    line = file.readline() 
    if line == '': # note that an empty line will return '\n', not ''! 
     break 
    index = new_index 
    # do stuff with line here 
+1

我認爲它是'範圍(30)' –

+0

@CésarBustíos - 對,我只是用一個較小的文件在本地嘗試它,並且不記得更新代碼。固定! – mac

+0

尼斯答案BTW :)對不起,我已經用我所有的票:( –

0

爲readlines方法的參數是大小(以字節爲單位)顯然150+線是30個字節的數據價值。

用for循環代替它會給你正確的結果。不幸的是,似乎沒有更好的內置函數。

5

使用itertools.islice

import itertools 

for line in itertools.islice(open("myText.txt"), 0, 30)): 
    print line 
+0

此解決方案似乎受@ShawnChin相同限制的影響:看起來整個文件在切片之前被加載到內存中。我得到了:[1.9277660846710205,1.9260480403900146,1.9186549186706543]'對於大約500行的文件,'[1.5532219409942627,1.5311739444732666,1.5274620056152344]'爲50中的一個,但我希望交叉檢查我的發現...... – mac

+0

@mac不,它不。如果你將一個文件對象傳遞給'islice'並重復兩次操作,你會看到它繼續停止,即文件直到結束才被讀取。 –

+0

@ShawnChin - 謝謝你,這絕對是一種更好的測試方式,而不像我那樣使用時間! :) – mac