我正在处理一个项目,想在一个文本文件中打印多行。这就是我为此目的使用的方法。
def story_part(file_path,initial_index,final_index):
line_number = list(range((initial_index -1) ,final_index ))
mylines = []
with open(file_path) as f:
for i , line in enumerate(f):
if i in line_number:
mylines.append(line.rstrip())
elif i > final_index:
break
for content in mylines:
print(content)
你能输入更有效的代码吗?
我试图从文本文件中打印指定的部分。我已经搜索了几个网站,没有找到任何有用的东西。
经过一段时间的摸索,我想出了这个功能。这是正确的方法,还是你可以帮助它改进?
5条答案
按热度按时间qlckcl4x1#
您可能可以在代码中进行的一个优化(无需更改太多)是将
line_number
设置为set
,以便索引查找变为常量。目前的答案是完美的。但是,
read()
、readlines()
、splitlines()
将整个数据加载到内存中。当文件大小很大时,这可能不是非常可伸缩的。您可以使用
itertools
作为迭代器读取文件。这种方式文件是只读的,直到
final_index
,只有所需的行被加载到内存中。(注意,initial_index
之前的所有文件行都将被读取,但被忽略。)7jmck4yq2#
我建议看看
.readlines
方法和切片,这可以让你输出的行范围更简洁,比如说如果我需要file.txt
的第5,6,7,8,9,10行,我可以按照下面的方式来做.readlines()
返回包含尾随换行符的行列表,[4:10]
是所谓的 slicing,它允许您获取列表的切片。然后我们使用空字符串连接行(因为它们已经有了换行符),并将end设置为空字符串(同样,由于换行符已经存在)。uwopmtnx3#
你不需要for循环。你只能通过python列表的切片特性来完成这项工作。
在上面的函数中,首先我读取数据并将其保存在一个名为
file_data
的变量中,该变量是文件中所有行的列表。请注意,使用.read().splitlines()
比使用.readlines()
更好,因为它省略了每行的\n
字符。然后,file_data[initial_index-1:final_index]
代码只选择所需的索引。之后,for循环打印数据(包含这一行只是因为代码中有它。这是不必要的。)这段代码没有额外的for循环和if语句。
你也可以在一个更小的情况下编写上面的代码,像这样:
这是完全相同的代码,但没有额外的变量和代码分离。
7uzetpgm4#
它可以在可读性方面有所改进,但你仍然需要遍历整个文件:
请注意,在阅读大文件时应避免使用
f.readlines()
,因为它会将整个文件存储在内存中。bnl4lu3b5#