我試圖採取一個文本文件,並只使用它的前30行在Python中。 這是我寫的:在Python中使用文本文件
text = open("myText.txt")
lines = myText.readlines(30)
print lines
由於某種原因,我得到更多的則150線當我打印? 我在做什麼錯?
我試圖採取一個文本文件,並只使用它的前30行在Python中。 這是我寫的:在Python中使用文本文件
text = open("myText.txt")
lines = myText.readlines(30)
print lines
由於某種原因,我得到更多的則150線當我打印? 我在做什麼錯?
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.
不完全確定,但是不會將所有行讀入內存中,然後保持前30個? – mac
@mac更新中的地址。 –
如果你要單獨處理你的線條,另一種可能是使用一個循環:
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
我認爲它是'範圍(30)' –
@CésarBustíos - 對,我只是用一個較小的文件在本地嘗試它,並且不記得更新代碼。固定! – mac
尼斯答案BTW :)對不起,我已經用我所有的票:( –
爲readlines方法的參數是大小(以字節爲單位)顯然150+線是30個字節的數據價值。
用for循環代替它會給你正確的結果。不幸的是,似乎沒有更好的內置函數。
import itertools
for line in itertools.islice(open("myText.txt"), 0, 30)):
print line
此解決方案似乎受@ShawnChin相同限制的影響:看起來整個文件在切片之前被加載到內存中。我得到了:[1.9277660846710205,1.9260480403900146,1.9186549186706543]'對於大約500行的文件,'[1.5532219409942627,1.5311739444732666,1.5274620056152344]'爲50中的一個,但我希望交叉檢查我的發現...... – mac
@mac不,它不。如果你將一個文件對象傳遞給'islice'並重復兩次操作,你會看到它繼續停止,即文件直到結束才被讀取。 –
@ShawnChin - 謝謝你,這絕對是一種更好的測試方式,而不像我那樣使用時間! :) – mac
不應該'線=文本.readlines(30)'? –