2

我正在尝试编写一个程序来向用户读取 5 行文本文档,但我无法让它工作。它当前打印第 4 行和第 5 行以及它们每个人的“\n”(新行)。这是代码:

filename = 'text_file_example.txt'
myfile = open(filename,'r')
myfile.readlines(5)
print(myfile.readlines(5))
myfile.close()

在 for(range 5) 循环中读取一行会更好吗?

4

4 回答 4

4

您正在使用的内置函数readlines()执行以下操作(来自官方文档):

f.readlines()返回一个包含文件中所有数据行的列表。如果给定一个可选参数sizehint,它会从文件中读取那么多字节以及足够多的字节来完成一行,并从中返回这些行。

也许您可能想这样做:

filename = 'text_file_example.txt'
myfile = open(filename,'r')
file_lines = myfile.readlines()
for line in file_lines[:5]: 
    print(line)
myfile.close()
于 2012-12-21T10:36:57.630 回答
0

readlines()返回所有行的列表,因此您可能应该这样做:

lines=myfile.readlines()[:5]

但由于它加载所有行,因此内存效率不高。

因此,这里更好的解决方案是使用itertools.islice

list(islice(myfile,5)) # it'll return a list of first five lines,
                       # no need of reading all lines
于 2012-12-21T10:35:39.247 回答
0

根据文档

If given an optional parameter sizehint, 
it reads that many bytes from the file and 
enough more to complete a line, and returns the lines from that

所以你最好的选择是使用 for 循环:

for line in myfile.readlines()[:5]:
    print line
于 2012-12-21T10:35:55.943 回答
0

如果要限制读取的行数,请将文件对象用作可迭代对象,然后使用以下命令对行进行切片itertools.islice

import itertools

filename = 'text_file_example.txt'
with open(filename,'r') as myfile:
    # skip five
    list(itertools.islice(myfile, 5))
    print(*itertools.islice(myfile, 5), sep='', end='')  # print 5, use newlines from file

请注意,我们print()使用语法将 5 个读取行作为一系列参数而不是一个对象传递给函数*,然后禁用自动空格和换行符;这些行不需要用空格分隔,并且已经包含换行符。

The above code will only ever read 10 lines of your file, regardless of how large it is. Calling .readlines() will (try to) read the whole file into memory, regardless of size and available memory.

于 2012-12-21T10:40:11.717 回答