2011-11-30 67 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