我如何读取python中的最后几行?

时间:2017-03-16 14:02:30

标签: python-3.x readfile

我必须阅读文件的最后一行。

我尝试了以下内容:

top_tb_comp_file = open('../../ver/sim/top_tb_compile.tcl', 'r+')
top_tb_comp_end = top_tb_comp_file.readlines()[:-4]
top_tb_comp_file.close()

无法正常工作(我在top_tb_comp_end中获取该文件的第一行)。

2 个答案:

答案 0 :(得分:1)

您的索引错误。使用[:-4],您要求与实际需要的完全相反。

尝试以下方法:

top_tb_comp_file = open('../../ver/sim/top_tb_compile.tcl', 'r+')
top_tb_comp_end = top_tb_comp_file.readlines()[-4:]
# you noticed that the '-4' is now before the ':'
top_tb_comp_file.close()

修改

感谢@Noctis,我围绕这个问题做了一些基准测试。关于collection.deque选项和file.readlines选项的速度和内存使用情况。

@Noctis建议的collection选项在内存使用方面似乎更好 AND 速度:在我的结果中,我在关键行的内存使用情况中观察到一点峰值{在file.readlines()[-4:]行没有发生的{1}}。此外,我在文件读取阶段重复了速度测试,在这种情况下,collections.deque(file, 4)选项似乎也更快。

我遇到了一些问题,显示使用SO渲染显示此代码的输出但是如果您安装了包memory_profilerpsutil,您应该能够自己看到(使用大文件)。

collections

只需输入以下内容:

import sys
import collections
import time

from memory_profiler import profile


@profile
def coll_func(filename):
    with open(filename) as file:
        lines = collections.deque(file, 4)
    return 0


@profile
def indexing_func(filename):
    with open(filename) as file:
        lines = file.readlines()[-4:]
    return 0


@profile
def witness_func(filename):
    with open(filename) as file:
        pass
    return 0


def square_star(s_toprint, ext="-"):
    def surround(s, ext="+"):
        return ext + s + ext

    hbar = "-" * (len(s_toprint) + 1)
    return (surround(hbar) + "\n"
            + surround(s_toprint, ext='|') + "\n"
            + surround(hbar))

if __name__ == '__main__':

    s_fname = sys.argv[1]
    s_func = sys.argv[2]

    d_func = {
        "1": coll_func,
        "2": indexing_func,
        "3": witness_func
    }

    func = d_func[s_func]

    start = time.time()
    func(s_fname)
    elapsed_time = time.time() - start

    s_toprint = square_star("Elapsed time:\t{}".format(elapsed_time))

    print(s_toprint)

n为1,2或3。

答案 1 :(得分:1)

以下示例打开名为names.txt的文件,并打印文件中的最后4行。应用于您的示例,您只需要删除第2行,第5行和第7行中给出的模式。其余的很简单。

#! /usr/bin/env python3
import collections


def main():
    with open('names.txt') as file:
        lines = collections.deque(file, 4)
    print(*lines, sep='')


if __name__ == '__main__':
    main()