我试图采取一个文本文件,并只使用它的前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)'? –